C++ xerces-c 파서를 이용한 프로그래밍 기초

Projects/CoVNC 2006. 11. 13. 22:11 Posted by soulfree >동네청년<
http://xml.apache.org/xerces-c/에서 라이브러리를 다운로드 받아야 합니다. 이 사이트에서 “Xerces-C++ is a validating XML parser written in a portable subset of C++”

즉, C++로 XML를 파싱하도록 합니다. 몇개 파싱 라이브러리가 존재하는데 이 Parser는 Free입니다.아무튼 이 사이트에 있는 설치를 보고 설치합니다. lib, 그에 맞는 filepath를 Visual c++에 설정을 해야한다. 에러가 좀 많이 나서 DOM 기반 파서만 여기서 풀어놓겠습니다.

#include [xercesc/util/PlatformUtils.hpp]
#include [xercesc/util/XMLString.hpp]
#include [xercesc/util/Base64.hpp]
#include [xercesc/util/PlatformUtils.hpp]
#include [xercesc/parsers/AbstractDOMParser.hpp]
#include [xercesc/parsers/XercesDOMParser.hpp]
#include [xercesc/dom/DOMImplementation.hpp]
#include [xercesc/dom/DOMImplementationLS.hpp]
#include [xercesc/dom/DOMImplementationRegistry.hpp]
#include [xercesc/dom/DOMBuilder.hpp]
#include [xercesc/dom/DOMException.hpp]
#include [xercesc/dom/DOMDocument.hpp]
#include [xercesc/dom/DOMNodeList.hpp]
#include [xercesc/dom/DOMError.hpp]
#include [xercesc/dom/DOMLocator.hpp]
#include [xercesc/dom/DOMNamedNodeMap.hpp]
#include [xercesc/dom/DOMAttr.hpp]
#include [xercesc/dom/DOM.hpp]
#include [xercesc/dom/DOMNodeFilter.hpp]
#include [xercesc/framework/MemBufInputSource.hpp]
#include [xercesc/framework/MemBufFormatTarget.hpp]
#include [xercesc/framework/LocalFileFormatTarget.hpp]

   // Initialize the XML4C2 system.
   try
   {
       XMLPlatformUtils::Initialize();
   }

   catch(const XMLException& toCatch)
   {
       char *pMsg = XMLString::transcode(toCatch.getMessage());
       XERCES_STD_QUALIFIER cerr << "Error during Xerces-c Initialization.\n"
            << "  Exception message:"
            << pMsg;
       XMLString::release(&pMsg);
       return 1;
   }

1.  XML 생성하기  

DOMImplementation* impl =
  DOMImplementationRegistry::getDOMImplementation(X("Core"));

//(Root )노드 생성
DOMDocument* doc = impl->createDocument(
         0,                    // root element namespace URI.
         X(”company”),   // root element name
         0);                   // document type object (DTD).

DOMElement* rootElem = doc->getDocumentElement();  

// node 생성와 값에 대한 값을 넣는다.
// 노드 생성
DOMElement*  prodElem = doc->createElement(X(”product”));
rootElem->appendChild(prodElem);

// 그 노드에 맞는 값
DOMText*    prodDataVal = doc->createTextNode(X(”Xerces-C”));
          prodElem->appendChild(prodDataVal);

2. 생성한 XML 파일로 저장하기.  

static XMLCh*  gOutputEncoding = 0;

DOMWriter  *theSerializer = ((DOMImplementationLS*)impl)->createDOMWriter();

// set user specified output encoding
theSerializer->setEncoding(gOutputEncoding);
XMLFormatTarget *myFormTarget;

myFormTarget = new LocalFileFormatTarget(”c://output.xml”);

theSerializer->writeNode(myFormTarget, *doc);  
3. 이미 생성된 XML 파일 검색하기  

// 이미 기본 설정한거라 보고…다운받으면 그 안에 소스가 존재합니다. 참고 바람.
// 외부 파일을 가져온다.
parser->resetDocumentPool();
doc = parser->parseURI(xmlFile);

// 파일을 검색할때는 재귀가 기본이다.

// DOMNode *n

if (n->getNodeType() == DOMNode::ELEMENT_NODE)

{

    // 노드의 이름 가져온다.
    char *name =  XMLString::transcode(n->getNodeName());

    // 노드에 대한 값을 가져온다.
    char* nodeValue = XMLString::transcode (n->getFirstChild()->getNodeValue ());

    // 속성
   if(n->hasAttributes()) {

        DOMNamedNodeMap *pAttributes = n->getAttributes();
        int nSize = pAttributes->getLength();

        // 한 노드에 붙어있는 모든 속성과 값을 가져온다.
        for(int i=0; nSize>i; i++){  
                   DOMAttr *pAttributeNode = (DOMAttr*) pAttributes->item(i);
                   // get attribute name
                   char *name = XMLString::transcode(pAttributeNode->getName());
                 
                   XERCES_STD_QUALIFIER cout << "Attribute Name : " << name << " -> “;
                   XMLString::release(&name);
                 
                   // get attribute type
                   name = XMLString::transcode(pAttributeNode->getValue());
                   XERCES_STD_QUALIFIER cout << “Attribute Value : “<< name << XERCES_STD_QUALIFIER endl;
                   XMLString::release(&name);
               }
   }
}

TAG , ,

댓글을 달아 주세요

  1. 짱민 2012.01.03 16:29  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~ 마침 xerces 파서 때문에 정보를 찾고 있었는데요
    유용한 정보 감사합니다 ^^
    혹시 인터넷에 똑같은 글이 블로그에 있던데..
    여기에서 작성하신 것이 원본인거죠? ;;

    • soulfree >동네청년< 2012.01.03 21:40 신고  댓글주소  수정/삭제

      안녕하세요.
      오래전 스크랩한 글이라 있는줄도 몰랐습니다.
      학교 다닐때 과제때문에 정보 수집차 모은글입니다.
      출처에 대한 개념도 없는 어릴적이라...이해해주시면 감사드리겠습니다 ㅠㅠ