TinyXML Download : http://sourceforge.net/projects/tinyxml/

09년 9월 8일 기준으로 2.5.3 버전으로 올라가있음.

파일 압축을 푼 후
tinystr.cpp
tinystr.h
tinyxml.cpp
tinyxml.h
tinyxmlerror.cpp
tinyxmlparser.cpp
파일들만 프로젝트에 추가.

그리고 tinyxml.h 만 인쿠르드 시키면 준비는 끝.

how to use.

TiXmlDocument g_doc;            // tinyxml 객체 변수 선언
g_doc.LoadFile( "파일명.xml" );

//또는
//TiXmlDocument g_doc( "파일명.xml" );
//g_doc.LoadFile();

TiXmlElement* pRoot = g_doc.RootElement();        // 루트 포인터 가져오기

//TiXmlNode* pNode = g_doc.FirstChild();
// 이 함수는 바로 아래 Child를 가져오는 함수인데. 어디든 바로 FirstChild() 호출하면
// 바로 다음 sibling 노드의 위치가 리턴된다. 단, LoadFile이후에 FirstChild()를 호출하게 되면
// 루트 엘리먼트가 아닌 <?xml version = ... >의 주소가 리턴되니 제일 처음엔
// 노드 이름을 알고 있어서 FirstChild( "노드명" )을 해주던가 root에서 FirstChild()를 호출하는 방법으로
// 시작하자.

<?xml version = 1.0 >
<root>
         <node>
                     text
          </node>
          <node2></node2>
</root>

<root> = RootElement(); 또는 FirstChild( "root" );
<node> = RootElement()->FirstChild(); 또는 FirstChild( "root" )->FirstChild();
<node2> = RootElement()->FirstChild("node2"); 또는 FirstChild( "root" )->FirstChild("node2");
                또는 RootElement()->sibling(); 등.. 접근 방법은 무궁무진
text = RootElement()->FirstChild()->ToElement()->GetText(); 주의할점은 FirstChild까지는 Node인데 ToElement부터는 Element로 포인트가 변경된다. GetText는 const char* 형 리턴.
 * TiXmlBase <- TiXmlNode <- TiXmlElement 의 상속구조.
 * 노드의 이름은 대소문자를 구별함. 잘 못 표기할 경우 NULL을 리턴하므로 주의.

RootElement()->FirstChild()->Value(); 하면 "node" 가 리턴됨

TiXmlHandle 이라는 녀석이 있는데, 아직은 잘 모르겠다.
핸들을 쓰게 되면 바뀌는 부분이 있는데 노드의 엘리먼트 값을 읽어올 때 이다.

const char* pText1 = RootElement()->FirstChild( "node" )->ToElement()->GetText();

TiXmlHandle hXml = RootElement()->FirstChild( "node" );
const char* pText2 = hXml.Element()->GetText();

두개 별 차이는 없어 보인다. 길게 들어간 노드의 주소를 일일이 타이핑 할 필요없이 핸들에 맡긴다던가 해서
타이핑을 줄이는 용도일라나? 아직은 잘 모르겠다.

이제 Attribute에 대한 부분 설명.
우선 엘리멘트 단까지 내려온다.
TiXmlNode* pNode = RootElement()->FirstChild( "test" )->FirstChild( "test2" );
TiXmlElement* pElement = pNode->ToElement();
// 만약 TiXmlNode가 아니고 TiXmlHandle로 받아왔다면 엘리먼트를 받아올때
// pNode->ToElement() 가 아니고 hXml.Element()이다. 주의.

//전략
<node name="test" index="99">테스트입니다.</node>
//후략

//Attribute용 변수 선언.
TiXmlAttribute* pAtt1 = pElement->FirstAttribute();
TiXmlAttribute* pAtt2 = pAtt->Next();

pAtt1->Value(); 를 호출하면 test 문자열을 뱉어낸다.
pAtt2->Value(); 는 99 ( 문자열이다. IntValue 나 DoubleValue가 있지만 안정성을 위해 문자열로 받아서
atoi 나 atof 로 변환해주는 방법을 쓰는건 어떨까 한다.)
참고로, pElement->Value() 는 node 이다.

만약, 특정 Attribute값을 가져오고 싶으면 함수 인자로 써주면 된다.
const char* pText = pElement->Attribute( "name" );
int index;
pElement->Attrib( "index", &index );
// 숫자나 실수형일 경우 위에 같이 함수인자로 사용해도 된다.

한방에 Element 까지 받아오는 방법.
지금까지는 노드 쭉 타고 가다가 ToElement()란 함수를 써서 엘리먼트의 주소를 가져왔지만
TiXmlElemnt* pElement = RootElement()->FirstChildElement( "찾을 엘리먼트의 노드명" );
이렇게 하면 한방에 엘리먼트~

마지막으로 정리.
XML 에서 Root는 언제나 단 한개뿐. 2진트리에서 꼭대기로 보면 됨.
Node란 Root에서 뻗어나간 2진트리의 각 지점을 노드라 부름.
Element란 노드를 구성하는 값들을 말하는 것 같음. 아직 명확한 정의가 잡히지 않았음.
Attribute란 엘리먼트의 값.