Xerces C++
學習筆記
1.
?
初始化平臺:
XMLPlatformUtils::Initialze()
2.
?
銷毀平臺:
XMLPlatformUtils::Terminate();
3.
?
加載分析報文
XercesDOMParser? *parser = new XercesDOMParser();
Parser->parse(
參數(shù)
);
這個參數(shù)可以直接是文件名,也可以是內(nèi)存的數(shù)據(jù),具體的查看
API
4.
?
數(shù)據(jù)格式轉(zhuǎn)換
XMLString.transcode()
這個方法有多個重載,既可以把
XMLCh *
格式的數(shù)據(jù)轉(zhuǎn)換成
char *
的數(shù)據(jù),也可以把
char *
的數(shù)據(jù)轉(zhuǎn)換成
XMLCh *,
我們也可以利用這個函數(shù)來初始化
XMLCh
格式類型的數(shù)組,比如
XMLCh temp[100];
??????????????????????????? XMLString.transcode(“LS”,temp,99);//
用“
LS
”初始化
temp
這個數(shù)組的內(nèi)容。
5.
?
分析報文后,如何得到文檔的樹型結(jié)構(gòu)
DOMDocument *xmlDoc = parser->getDocument();
6.
?
得到樹型結(jié)構(gòu)后,如何得到第一個根節(jié)點
DOMElement *root = xmlDoc->getDocumentElement();
7.
?
如何遍歷文檔的結(jié)構(gòu)
遍歷一個樹型的文檔結(jié)構(gòu)有三種方法。
1
.使用
DOMNodeIterator
類
DOMNodeIterator *iterator = xmlDoc->createNodeIterator(root, DOMNodeFilter::SHOW_TEXT,? NULL, true);
for ( DOMNode * current = (DOMNode *)iterator->nextNode(); current != 0; current = (DOMNode *)iterator->nextNode() )
{
??????? string strValue = XMLString::transcode(current->getNodeValue());
??????? std::cout <<strValue<<endl;
?}//
以上就可以把
xml
文檔中的屬性為
NODETEXT
節(jié)點的內(nèi)容給打印出來。
2
.使用
DOMTreeWalker
類
D
OMTreeWalker *walker =??xmlDoc->createTreeWalker(root, DOMNodeFilter::SHOW_TEXT, NULL, true);
f
or (DOMNode *current = walker->nextNode(); current != 0; current = walker->nextNode() )? ?
?{
? ?? ?char *strValue = XMLString::transcode( current->getNodeValue() );? ? ?std::cout <<strValue;
? ?? ?? ?? ?XMLString::release(&strValue);? ?
}
3
.使用子節(jié)點直接遍歷樹型結(jié)構(gòu)
?? DOMNode *n = (DOMNode*)xmlDoc->getDocumentElement();
//
下面開始遍歷這個樹的結(jié)構(gòu)
if(n)
{
??????? if (n->getNodeType() == DOMNode::ELEMENT_NODE)
??????? {
??????????????
?DOMNodeList* nodeList = n->getChildNodes();
??????????????
?unsigned int nListLen = nodeList->getLength();
??????????????
?for (unsigned int i=0; i<nListLen; ++i)
??????????????
?{
????????????????????? DOMNode* nodeTemp = nodeList->item(i);
????????????????????? if (nodeTemp->getNodeType() == DOMNode::ELEMENT_NODE)
????????????????????? {
???????????????????????????? for (DOMNode* node1=nodeTemp->getFirstChild(); node1!=0; node1=node1->getNextSibling())
???????????????????????????? {
??????????????????????????????????? char* name = XMLString::transcode(node1->getNodeName());
??????????????????????????????????? string strTemp = name;
??????????????????????????????????? if (strTemp == "name")?? //
這個就是跟
xml
文檔中
name
節(jié)點匹配
??????????????????????????????????? {
??????? char* myname=XMLString::transcode(node1->getFirstChild()->getNodeValue());
?????????????????????????????????????????? cout<<myname<<endl;
??????????????????????????????????? }
???????????????????????????? }
????????????????????? }
????????????????????? continue;
?????????????? }
??????? }
}
8.
?
如何添加子節(jié)點。
??? //Add new (empty) Element to the root element
???? DOM_Element parentNode = …;// parent is known
???? DOM_Element prodElem = doc->createElement (tagName);
???? parentNode->appendChild (prodElem);
9.
?
在加載
xml
文件分析前,有兩種加載方式:一種直接通過文件加載,一種是通過內(nèi)存加載
1.
?
String xmlfile = “a.xml”;
Parser->parse(xmlfile.c_str());
??????? 2.MemBufInputSource ?
這個類處理內(nèi)存的數(shù)據(jù),然后利用
parser->parse(*men)//men
是
MemBufInputSource ?
的實例指針對象。
10.
?????????????
在加載分析報文前,可以設置
XercesDOMParser
的一些屬性。
???????
P
arser->setValidationScheme( XercesDOMParser::Val_Auto );
? ??? ????Parser->setDoNamespaces( false );
? ? ?????Parser->setDoSchema( false );
? ? ?????Parser->setLoadExternalDTD( false );
??????? //
這個部分的代碼可以參照類庫自帶的例子。
11.
?????????????
我們也可以設置錯誤的處理代碼。
???????
這部分可以查看類庫下的
DOMPrint
例子。
DOMError ,DOMErrorHandler
12.
?????????????
也可以設置分析過濾的屬性
???????? DOMNodeFilter?
這個類能起到這個效果
13.
?????????????
要美化文檔的格式化輸出,我們可以使用
??????? XMLFormatter??? XMLFormatTarget? ,
用的時候可以查看。
14?????
我們也可以通過
DOMImplementationLs , DOMImplementation
前者是后者的基類。通過這個類我們可以創(chuàng)建
DOMBuilder
(
parser
)或
DOMWriter
(序列,既可以寫到屏幕,也可以寫到文件)