#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]