일단, http://xml.apache.org/xerces-c/에서 라이브러리를 다운로드 받아야 한다. 이 사이트에서
Xerces-C++ is a validating XML parser written in a portable subset of C++. 이래 나왔네요..
즉, C++로 XML를 파싱하도록 합니다.
몇개 파싱 라이브러리가 존재하는데 이것은 꽁자더군요..^^;;
아무튼 이 사이트에 있는 설치를 보고 설치합니다. lib, 그에 맞는 filepath를 Visual c++에 설정을 해야한다.
에러가 좀 많이 나서 DOM 기반 파서만 여기서 풀어놓겠습니다.
include은 다음과 같이 합니다.
#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/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;i<nSize;++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_ST
D_QUALIFIER endl;
XMLString::release(&name);
}
}
}