본문 바로가기

Projects/CoVNC

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

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);
               }
   }
}

'Projects > CoVNC' 카테고리의 다른 글

MSDN XML DOM API Library  (0) 2006.11.14
[DOM] DOM(Document Object Model) 이해하기(API포함)  (1) 2006.11.14
DOM에 대한 소개  (0) 2006.11.13
C, C++ DOM API  (0) 2006.11.09
API에서 HINSTANCE와 HWND에 대한 질문입니다.  (0) 2006.11.08