쓸만한 XML Parser

대문 / 검토 / 쓸만한 XML Parser

쓸만한 XML Parser

  • ezXML - XML Parsing C Library : [http]http://ezxml.sourceforge.net/[]
    • 사용하기 제일 간편하고 이해하기 쉬운 구조를 가지고 있음
    • 완벽한 XML 구문파싱을 지원하지는 않지만 필요요소 대부분을 활용하는데 손색이 없으며 비교적 빠른편
    • 완전히 메모리에 올려서 파싱하는 구조이기 때문에 커다란 규모의 XML에는 사용이 적절치 않음
    • Tag내의 Sub tag가 data 중간에 오는 "<doc>Hello world<br />This is example</doc>" 와 같은 경우 다시 XML원문으로 환원할수 없고 data를 온전하게 추출하지 못함
  • The Expat XML Parser : [http]http://expat.sourceforge.net/[]
    • 참고자료
    • 개발자가 XML Working Group의 Leader였던 James Clark 임
    • SAX 방식
    • 예제 (원문: [http]http://blog.daum.net/aswip/8429353[])
      #pragma warning(disable:4996)
      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      #include <tchar.h>
      
      #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("<NameBook since=\"1997\"><name>John</name></NameBook>");
          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]http://www.grinninglizard.com/tinyxml/[]
  • Xerces-C++ XML Parser : [http]http://xerces.apache.org/xerces-c/[]
  • Libxml2 : [http]http://xmlsoft.org/[]

참고자료

Retrieved from https://www.minzkn.com:443/moniwiki/wiki.php/XMLParserResearch
last modified 2021-10-21 11:44:59