본문 바로가기

프로그램언어/C++

[ C++ ] tinyXML 에 관련된 고찰



XML 라이브러리중에 널리 사용되고 있는 tinyXML에 대해서 공부한 내용을 정리 해보려고 합니다. 

피플Inside tv 시청중 이런 말이 생각이 나네요. 동물적인 삶을 이어가라. 내용을 풀이 해주는 과정을 들으니, 공감이 가는 

내용이 이기에 소개하려고 합니다. 동물은 먹이감 또는 식사(?)시 하나에만 집중 한다는 이야기 공부도 비슷한 원리가

아닐까 하는 생각이 들었습니다. 산만하게 일처리하는 것보다는 목표를 삶고 있는 내용에 집중할 수 있도록 내 자신에

대해 담금질을 해야 하지 않을까 라는 생각이 들었습니다.

  다시 원문으로 돌아와서 openfire에 사용하고 있는 XMPP을 공부하고 구현하여 사용하던 도중에 이런생각이 들었습니다.

아 XML이 좋긴 한데 사용법에 대해 좀더 구체적으로 공부하면 좋겠다라는 생각이 자리 잡은지 몇개월만에 시간이

좀 여유로운 관계로 조금 공부좀 해봤습니다.






이 내용을 보기 위해서는 간단하게 tinyXML 홈페이지를 참조하시고 간략하게 사용법 및 관련사항만 나열하게 될 것입니다.

보다 더 많은 정보를 원하시는 경우에는 홈페이지 doxygen을 참조하여 많은 정보를 얻는 것을 권고합니다.


Handle 

XML documents에서 중요한 것은 method을 호출시 그 리턴값으로 null을 검사해야 합니다.


TiXmlHandle을 사용하게 된다면 코드의 양을 줄일 수 있습니다.

 
 
How TinyXML works.

다음 예제에서 보이는 XML을 가지고 작업하게 됩니다.


 위 XML 코드을 가지고 어떻게 TinyXML에서 매핑하고 있는지 이해를 돋고자 아래 매핑 테이블을 보게 되면 보다 쉽게 구조적 

이해를 할 수 있습니다.

 

<-- Our to do list data -->//TiXmlComment Object


<ToDo>// TiXmlElement


<Item priority="1"> //TiXmlElement


<bold> // TIXmlText





#include "stdafx.h"

#include <iostream>

#include <sstream>

#include <tinyXML/tinyxml.h>

int _tmain(int argc, _TCHAR* argv[])

{

const char* demoStart =

"<?xml version=\"1.0\"  standalone='no' >\n"

"<!-- Our to do list data -->"

"<ToDo>\n"

"<!-- Do I need a secure PDA? -->\n"

"<Item priority=\"1\" distance='close'> Go to the <bold>Toy store!</bold></Item>"

"<Item priority=\"2\" distance='none'> Do bills   </Item>"

"<Item priority=\"2\" distance='far &amp; back'> Look for Evil Dinosaurs! </Item>"

"</ToDo>";


{

TiXmlDocument doc("demotest.xml");

  doc.Parse(demoStart);


if( doc.Error())

{

std::cout << "Error " <<std::endl;

exit(1);

}

doc.SaveFile();

}


TiXmlDocument doc("demotest.xml");

bool loadOkay = doc.LoadFile();


if( !loadOkay)

{

std::cout << "Error" <<std::endl;

exit(1);

}


doc.Print( stdout );


// {

// TiXmlPrinter printer;

// doc.Accept(&printer);

// fprintf( stdout, "%s", printer.CStr());

// }


TiXmlNode* node = 0;

TiXmlElement* todoElement = 0;

TiXmlElement* itemElement = 0;


node = doc.FirstChild( "ToDo" );

assert( node );

todoElement = node->ToElement();

assert( todoElement  );


// Going to the toy store is now our second priority...

// So set the "priority" attribute of the first item in the list.

node = todoElement->FirstChildElement(); // This skips the "PDA" comment.

assert( node );

itemElement = node->ToElement();

assert( itemElement  );

itemElement->SetAttribute( "priority", 2 );


// Change the distance to "doing bills" from

// "none" to "here". It's the next sibling element.

itemElement = itemElement->NextSiblingElement();

assert( itemElement );

itemElement->SetAttribute( "distance", "here" );


// Remove the "Look for Evil Dinosaurs!" item.

// It is 1 more sibling away. We ask the parent to remove

// a particular child.

itemElement = itemElement->NextSiblingElement();

todoElement->RemoveChild( itemElement );


itemElement = 0;




// --------------------------------------------------------

// What follows is an example of created elements and text

// nodes and adding them to the document.

// --------------------------------------------------------


// Add some meetings.

TiXmlElement item( "Item" );

item.SetAttribute( "priority", "1" );

item.SetAttribute( "distance", "far" );


TiXmlText text( "Talk to:" );


TiXmlElement meeting1( "Meeting" );

meeting1.SetAttribute( "where", "School" );


TiXmlElement meeting2( "Meeting" );

meeting2.SetAttribute( "where", "Lunch" );


TiXmlElement attendee1( "Attendee" );

attendee1.SetAttribute( "name", "Marple" );

attendee1.SetAttribute( "position", "teacher" );


TiXmlElement attendee2( "Attendee" );

attendee2.SetAttribute( "name", "Voel" );

attendee2.SetAttribute( "position", "counselor" );


// Assemble the nodes we've created:

meeting1.InsertEndChild( attendee1 );

meeting1.InsertEndChild( attendee2 );


item.InsertEndChild( text );

item.InsertEndChild( meeting1 );

item.InsertEndChild( meeting2 );


// And add the node to the existing list after the first child.

node = todoElement->FirstChild( "Item" );

assert( node );

itemElement = node->ToElement();

assert( itemElement );


todoElement->InsertAfterChild( itemElement, item );


printf( "\n** Demo doc processed: ** \n\n" );

doc.Print( stdout );


// --------------------------------------------------------

// Different tests...do we have what we expect?

// --------------------------------------------------------

int count = 0;

TiXmlElement* element;


node = doc.RootElement();

assert( node );


doc.SaveFile();

return 0;


간단한 예제를 통해서 사용법에 대해서 공부해봤습니다. 이제 Parser을 만든 후, 만약 stream 패킷이 왔다는 전제로 파싱하는 부분을 만들어

보겠습니다. 이건 다음 시간에 ....