1. 程式人生 > >Xerces-c DOM XML檔案的構造

Xerces-c DOM XML檔案的構造

Xerces中構造xml很簡單,但是想輸出就很麻煩,Xerces支援三種輸出 輸出到記憶體
輸出到標準輸出 輸出到本地檔案
下面列出用到的一些重要的類,可以查詢官網API解鎖更多的用法

1.DOMImplementation和DOMImplementationLS這兩貨是DOM界的造物者,如果你發現你有構造不了的類,查詢這兩貨的API就可以啦,比如
DOMDoument DOMLSSerializer
2.DOMLSOutput獲得輸出的控制代碼,通過與輸出目標繫結 正如上面提及的 MemBufFormatTarget StdOutFormatTarget LocalFileFormatTarget,此外還可以設定輸出的編碼方式等行為
3.DOMLSSerializer 序列化DOMDocument控制代碼和輸出控制代碼,使得二者相關聯

下面來看看例子吧,解鎖它的用法

#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/dom/DOM.hpp>
#include <iostream>
#include <xercesc/framework/LocalFileFormatTarget.hpp>

#define Transcode_1(x)  XMLString::transcode(x)
#define Transcode_3(x,y,z) XMLString::transcode(x,y,z)

using namespace
xercesc; int main() { try { XMLPlatformUtils::Initialize(); } catch (const XMLException& toCatch) { std::cerr << Transcode_1(toCatch.getMessage()); } try { DOMImplementation* imp = DOMImplementationRegistry::getDOMImplementation(Transcode_1("Core"
)); DOMDocument* doc = imp->createDocument(0,Transcode_1("root"),0); DOMElement* node = doc->createElement(Transcode_1("node1")); node->setAttribute(Transcode_1("name"),Transcode_1("node1")); node->setTextContent(Transcode_1("node1")); DOMElement* root = doc->getDocumentElement(); root->appendChild(node); DOMElement* node2 = doc->createElement(Transcode_1("node2")); node2->setAttribute(Transcode_1("name"),Transcode_1("node2")); node2->setTextContent(Transcode_1("node2")); root->appendChild(node2); DOMElement* node2_1 = doc->createElement(Transcode_1("node2_1")); node2_1->setAttribute(Transcode_1("name"),Transcode_1("node2_1")); node2_1->setTextContent(Transcode_1("node2_1")); node2->appendChild(node2_1); DOMLSOutput* output = dynamic_cast<DOMImplementationLS*>(imp)->createLSOutput(); DOMLSSerializer* serial = dynamic_cast<DOMImplementationLS*>(imp)->createLSSerializer(); XMLFormatTarget* target = new LocalFileFormatTarget("2.xml"); output->setByteStream(target); serial->write(doc,output); doc->release(); serial->release(); delete target; } catch (const DOMException& toCatch) { std::cerr << Transcode_1(toCatch.getMessage()); } return 0; }