#keywords xml,parser,library,api,sax,tokenize,html,dockbook,ezxml,expat,libxml2
#title 쓸만한 XML Parser
[wiki:Home 대문] / [wiki:CategoryReview 검토] / [wiki:XMLParserResearch 쓸만한 XML Parser]
----
== [wiki:XMLParserResearch 쓸만한 XML Parser] ==
* ezXML - XML Parsing C Library : [^http://ezxml.sourceforge.net/]
* 사용하기 제일 간편하고 이해하기 쉬운 구조를 가지고 있음
* 완벽한 XML 구문파싱을 지원하지는 않지만 필요요소 대부분을 활용하는데 손색이 없으며 비교적 빠른편
* 완전히 메모리에 올려서 파싱하는 구조이기 때문에 커다란 규모의 XML에는 사용이 적절치 않음
* Tag내의 Sub tag가 data 중간에 오는 "Hello world
This is example" 와 같은 경우 다시 XML원문으로 환원할수 없고 data를 온전하게 추출하지 못함
* The Expat XML Parser : [^http://expat.sourceforge.net/]
* 참고자료
* [^http://en.wikipedia.org/wiki/Expat_(XML)]
* [^http://blog.daum.net/aswip/8429353]
* 개발자가 XML Working Group의 Leader였던 James Clark 임
* SAX 방식
* 예제 (원문: [^http://blog.daum.net/aswip/8429353])
{{{#!enscript c
#pragma warning(disable:4996)
#include
#include
#include
#include
#define XML_STATIC /* for static linking */
#if defined (UNICODE)
# define XML_UNICODE_WCHAR_T
#endif
#include "expat.h"
#if defined (UNICODE)
# pragma comment(lib, "libexpatMTw.lib")
#else
# pragma comment(lib, "libexpatMT.lib")
#endif
typedef struct NameBook
{
int m_nSince;
char m_szName[0xFF];
} NameBook;
static void XMLCALL StartElement(void *pUserData, const char *name, const char **atts)
{
int i = 0;
const char *pszAttrName = NULL;
const char *pszAttrValue = NULL;
NameBook *pNameBook = (NameBook *)pUserData;
for (i = 0; atts[i]; i += 2)
{
pszAttrName = atts[i];
pszAttrValue = atts[i+1];
if ( _tcscmp(pszAttrName, _T("since")) == 0 && pszAttrValue )
pNameBook->m_nSince = _tstoi(pszAttrValue);
}
}
static void XMLCALL VisitData(void *pUserData, const char *s, int len)
{
NameBook *pNameBook = (NameBook *)pUserData;
if ( pNameBook && s && len > 0 )
{
_tcsncpy(pNameBook->m_szName, s, len);
pNameBook->m_szName[len] = 0;
}
}
static void XMLCALL EndElement(void *pUserData, const char *name)
{
NameBook *pNameBook = (NameBook *)pUserData;
}
int main(int argc, char **argv)
{
int bEof = 1;
const char *pszXMLDoc = _T("John");
XML_Parser parser = NULL;
NameBook nameBook;
memset(&nameBook, 0x00, sizeof(NameBook));
parser = XML_ParserCreate(NULL);
XML_SetUserData(parser, (void *)&nameBook);
XML_SetElementHandler(parser, StartElement, EndElement);
XML_SetCharacterDataHandler(parser, VisitData);
if (XML_Parse(parser, pszXMLDoc, _tcslen(pszXMLDoc), bEof) == XML_STATUS_ERROR)
{
_tprintf(_T("%s at line %u\n"), XML_ErrorString(XML_GetErrorCode(parser)),
XML_GetCurrentLineNumber(parser));
return 1;
}
_tprintf(_T("NameBook Since %d, Name : '%s'\n"), nameBook.m_nSince, nameBook.m_szName);
XML_ParserFree(parser);
return 0;
}
}}}
* TinyXML : [^http://www.grinninglizard.com/tinyxml/]
* Xerces-C++ XML Parser : [^http://xerces.apache.org/xerces-c/]
* Libxml2 : [^http://xmlsoft.org/]
== 참고자료 ==
* [^http://ko.wikipedia.org/wiki/XML]
* [^http://ko.wikipedia.org/wiki/%EB%AC%B8%EC%84%9C_%EA%B0%9D%EC%B2%B4_%EB%AA%A8%EB%8D%B8]
* [^http://ko.wikipedia.org/wiki/SAX]