[펌] 초간단 TinyXml 사용 방법
Posted on 2009. 6. 16. 15:25
Filed Under Programming/Basic
초간단 TinyXml 사용 방법
TinyXML: http://www.sourceforge.net/projects/tinyxml
작성자 : 최흥배 ( jacking75@gmail.com )
문서 최종 수정일 : 2004.10.09
--- 예제로 사용 될 xml 문서
<?xml version="1.0" encoding="euc-kr"?>
<MAJAK>
<LOBBY_CONTROL>
<OptionIndex="1125"X="697"Y="3"W="18"H="15">로비옵션</Option>
<WindowHideIndex="1160"X="732"Y="3"W="18"H="15">창숨기기</WindowHide>
<LobbyChangeIndex="1027"X="32"Y="40"W="116"H="40">로비나가기</LobbyChange>
<EnterRoom Index="1033" X="152"Y="40" W="116"H="40">방들어가기</EnterRoom>
<MakeRoom Index="1011"X="276"Y="40" W="116" H="40">방만들기</MakeRoom>
<RoomInfo Index="1015" X="398" Y="40" W="116" H="40">관전자정보</RoomInfo>
<RoomList Index="1002" X="28" Y="94" W="507" H="257">방리스트</RoomList>
<UserList Index="1037" X="568" Y="102" W="216" H="233">유저리스트</UserList>
<FindText Index="1090" X="603" Y="360" W="87" H="20">유저찾기입력</FindText>
<IDFind Index="1091" X="693" Y="360" W="20" H="18">ID 찾기</IDFind>
<IsWhisper Index="1088" X="717" Y="357" W="12" H="10">귓속말설정</IsWhisper>
<IsInvite Index="1089" X="717"Y="373" W="12" H="10">초대설정</IsInvite>
<ChatInput Index="1035" X="34" Y="500" W="416" H="18">채팅입력</ChatInput>
<Charging Index="1005" X="461" Y="498" W="60" H="20">신고</Charging>
<Banner Index="2000" X="10" Y="536" W="545" H="44">배너</Banner>
<QuickStart Index="1084" X="573" Y="550" W="100" H="24">바로시작</QuickStart>
<FullScreen Index="1172" X="677" Y="550" W="100" H="24">전체화면</FullScreen>
<Windowed Index="1173" X="677" Y="550" W="100" H="24">창화면</Windowed>
<Avata X="577" Y="420" W="56" H="111">아바타</Avata>
</LOBBY_CONTROL>
<ROOM_CONTROL>
<GAME_BTNIndex="7000"X="706"Y="0"File=".\\data\\Gbtn_Capture.spr">화면캡쳐</GAME_BTN>
<GAME_BTNIndex="7001"X="729"Y="2"File=".\\data\\Gbtn_WndMin.spr">방숨기기</GAME_BTN>
<GAME_BTNIndex="7003"X="773"Y="2"File=".\\data\\Gbtn_WndClose.spr">방나가기</GAME_BTN>
<GAME_BTNIndex="7004"X="640"Y="509"File=".\\data\\Gbtn_Entry.spr">참여</GAME_BTN>
<GAME_BTNIndex="7005"X="640"Y="509"File=".\\data\\Gbtn_Observe.spr">관전</GAME_BTN>
<GAME_BTNIndex="7017"X="682"Y="509"File=".\\data\\Gbtn_ObserveInfo.spr">관전자정보</GAME_BTN>
<GAME_BTNIndex="7006"X="745"Y="509"File=".\\data\\Gbtn_Option.spr">설정</GAME_BTN>
<GAME_BTNIndex="7007"X="640"Y="539"File=".\\data\\Gbtn_Invite.spr">초대</GAME_BTN>
<GAME_BTNIndex="7008"X="689"Y="539"File=".\\data\\Gbtn_112.spr">신고</GAME_BTN>
<GAME_BTNIndex="7009"X="738"Y="539"File=".\\data\\Gbtn_Out.spr">방 나가기</GAME_BTN>
<GAME_BTNIndex="7010"X="172"Y="578"File=".\\data\\MajakBtn_Bbong.spr">뽕</GAME_BTN>
<GAME_BTNIndex="7011"X="213"Y="578"File=".\\data\\MajakBtn_Jji.spr">찌</GAME_BTN>
<GAME_BTNIndex="7012"X="254"Y="578"File=".\\data\\MajakBtn_Kkang.spr">깡</GAME_BTN>
<GAME_BTNIndex="7013"X="295"Y="578"File=".\\data\\MajakBtn_Rich.spr">리치</GAME_BTN>
<GAME_BTNIndex="7014"X="336"Y="578"File=".\\data\\MajakBtn_Cheumo.spr">츠모</GAME_BTN>
<GAME_BTNIndex="7015"X="377"Y="578"File=".\\data\\MajakBtn_Rone.spr">론</GAME_BTN>
<GAME_BTNIndex="7016"X="418"Y="578"File=".\\data\\MajakBtn_Pass.spr">패스</GAME_BTN>
<GAME_BTNIndex="7018"X="266"Y="400"File=".\\data\\Gbtn_Start.spr">게임시작요청</GAME_BTN>
<GAME_BTNIndex="7019"X="190"Y="478"File=".\\data\\MaJakResult_Btn.spr">결과창의OK</GAME_BTN>
</ROOM_CONTROL>
<ROOM_LAYOUT>
<USERINFO_POSNUM="0"X="12"Y="32">왼쪽상단</USERINFO_POS>
<USERINFO_POSNUM="1"X="514"Y="32">오른쪽상단</USERINFO_POS>
<USERINFO_POSNUM="2"X="563"Y="557">오른쪽하단</USERINFO_POS>
<USERINFO_POSNUM="3"X="62"Y="562">왼쪽하단</USERINFO_POS>
</ROOM_LAYOUT>
</MAJAK>
----------
1. TinyXml을 사용 할려면
- 먼저 TinyXml 라이브러리를 다운 받은 후 빌더를 해야된다. 빌더를 할 때는 이 라이브러리를 사용할 프로젝트가 싱글 쓰레드인지 멀티 쓰레드 인지에 따라서 tinyXml의 쓰레드 옵션을 설정 후 빌드를 해야된다.
- 빌드가 끝나면 사용할 프로젝트에서 lib파일을 링크 시킨다.
- tinyxml.h, tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp를 프로젝트 폴더에 포함시킨다.
- 위 파일 중 tinyxml.h파일만 소스에서 include 하면 된다.
- 사용할 프로젝트가 만약 mfc 프로젝트로 stdafx 파일을 사용한다면 tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp 의 상단에 #include ‘stdafx.h”를 입력해야 된다.
- TinyXml을 사용한 후 따로 delete로 지울 필요는 없다( 즉TiXmlNode* node; 이렇게사용된것들..).
2. xml 파일 읽기
- TiXmlDocument doc( "MaJak_Para.xml" );
doc.LoadFile();
- TiXmlDocument m_XmlDoc;
if( m_XmlDoc.LoadFile("MaJak_Para.xml" ) == false )
return ERR_LOADXML;
3. 노드의 이동
- 루트에서시작하여바로 Option 노드로이동할려면
TiXmlNode* node = doc.FirstChild("MAJAK")->FirstChild("LOBBY_CONTROL")->FirstChild( "Option" );
- 루트에서 LOBBY_CONTROL노드로이동할려면
node = doc.FirstChild();
node = node->NextSibling();
int Pos = 1
for( i = 0; i < Pos; ++i )
{
node = node->FirstChild();
}
여기에서 Pos를 2로하면 LOBBY_CONTROL노드의첫번째자식까지이동한다.
- LOBBY_CONTROL 노드에있는상태에서이노드의자식중LobbyExit노드로바로갈려면
node = node->FirstChild( "LobbyExit" );
-노드의값을볼려면 node->Value()로하면문자가나온다.
- 도큐먼트의 top 레벨의기준으로해서자식노드로이동할려면
count = 0;
for( node = doc.FirstChild();
node;
node = node->NextSibling() )
{
count++;
}
// 아래서위로이동할려면
count = 0;
for( node = doc.LastChild();
node;
node = node->PreviousSibling() )
{
count++;
}
// 이터레이터를사용
count = 0;
for( node = doc.IterateChildren( 0 );
node;
node = doc.IterateChildren( node ) )
{
count++;
}
4. 노드의애트리뷰트값을얻기
- 현재노드에서모든자식노드의애트리뷰트값을얻을려면다음과같이한다.
node = node->FirstChild();
CONTROL_RECT ControlRect;
TiXmlElement* elem;
while( node != NULL )
{
elem = node->ToElement();
elem->Attribute( "Index", &ControlRect.index )
elem->Attribute( "X", &ControlRect.x );
elem->Attribute( "Y", &ControlRect.y );
elem->Attribute( "W", &ControlRect.w );
elem->Attribute( "H", &ControlRect.h );
node = node->NextSibling();
}
Attribute 의리턴값으로애트리뷰트값의문자형을얻을수있다.
- 애트리뷰트이동방법
// 노드의첫애트리뷰트에서마지막애트리뷰트까지이동
count = 0;
for( element = todoElement->FirstChildElement();
element;
element = element->NextSiblingElement() )
{
count++;
}
5. 애트리뷰트를 얻을 수 있도록 노드 대신 element를 얻는 방법
node = node->FirstChild();
TiXmlElement* Rootelem = node->NextSiblingElement( _strNodeName );
TiXmlElement* elem = Rootelem->FirstChildElement( _strSubNodeName );
elem->Attribute( "Index", &iIndex );
6. 애트리뷰트의첫버째속성과다음속성을얻는방법
TiXmlAttribute* Attribut;
Attribut = elem->FirstAttribute()
// 정수및스트링을얻을수있다.
Attribut->IntValue();
Attribut->Value();
// 다음애트리뷰트값을얻을렴ㄴ
Attribut = Attribut->Next();
<출처: http://jacking.springnote.com/pages/2844150>
<글주인블로그: http://blog.naver.com/jacking75>