2008/11/27

작고 빠르고 편한 Open Source XML Parser - RapidXML

XML 데이터를 분석해야 할 일이 있어서 공개 소스로 이루어진 프로젝트를 찾아 보았다.

TinyXML 과  RapidXML 을 찾았는데 둘 중 가볍고 사용하기 편한 RapidXML 을 사용하기로 하였다.

RapidXML 소스를 받으면 4개의 소스 파일로만 이루어 졌다.

rapidxml.hpp
rapidxml_iterators.hpp
rapidxml_print.hpp
rapidxml_utils.hpp

rapidxml_print 는 XML을 출력하는 기능이 포함되어 있고. rapidxml_utils 은 XML 데이터 파일을 읽어들이는 기능을 한다.

기본적인 XML 데이터 탐색을 하기위해서는 rapidxml.hpp 만 포함시키면 된다.

기본적인 사용법은 아래의 소스를 보면 한눈에 알 수 있다.


#include "rapidxml.hpp"
#include "rapidxml_utils.hpp"
using namespace rapidxml;

// XML 문서 데이터를 저장할 변수
vector< TCHAR > xmlData;

// XML 파일 불러오기
basic_ifstream<TCHAR> xmlFile( strFile );
xmlFile.seekg(0, ios::end);
size_t size = xmlFile.tellg();
xmlFile.seekg(0);

xmlData.clear();
xmlData.resize( size + 1);
xmlData[size] = 0;

xmlFile.read( &xmlData.front(), (streamsize)size );

// XML Parsing
xml_document< TCHAR > xmlDoc;
xmlDoc.parse<0>( &xmlData.front() );

TCHAR* Name;
TCHAR* Value;
xml_node< TCHAR >* Item;
xml_node< TCHAR >* SubItem;
xml_attribute< TCHAR >* Attr;

// root 포인터
xml_node< TCHAR >* root = xmlDoc.first_node();

// root 하위 Node 탐색
for ( Item = root->first_node(); Item; Item = root->next_sibling())
{
// Node 이름
Name = Item->name();

// Node 의 Attribute 탐색
for ( Attr = Item->first_attribute(); Attr;
Attr = Attr->next_attribute() )
{
Name = Attr->name(); // Attribute 의 이름
Value = Attr->value(); // Attribute 의 값
}

for ( SubItem = Item->first_node(); SubItem;
SubItem = SubItem->next_sibling() )
{
Name = Attr->name(); // Sub node 의 이름
}
}

RapidXML 홈페이지
TinyXML 홈페이지

Original Post : http://neodreamer-dev.tistory.com/204

No comments :

Post a Comment