2016-11-29 84 views
1

我使用Xerces C++ API編寫了XML解析器。我有獲得節點值的方法,似乎間歇性地工作,我不知道爲什麼。Xerces DOMNode返回節點名稱#Text

我是新來的XML所以請原諒,如果我沒有所有的行話正確。

例如,我可以成功驗證解析XML文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?> 
<RequestMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../schema/Config.xsd"> 
    <MsgHeader> 
    <MessageID>0</MessageID> 
    <Gic>0000</Gic> 
    <Fcg>1</Fgc> 
    <EventID>0</EventID> 
    </MsgHeader> 
    <PrimaryRate> 
    <Rate>MAX_RATE</Rate> 
    <Value>1</Value> 
    </PrimaryRate> 
    <SecondaryRate> 
    <Rate>MAX_RATE</Rate> 
    <Value>2</Value> 
    </SecondaryRate> 
<Mode>Enable</Mode> 
<Toggle>On</Toggle> 
</RequestMessage> 

讓我們說,例如,我在尋找「FGC」「MsgHeader」下的值。我可以使用DOMNode :: getNodeName()成功獲取消息頭的節點名稱,並且可以獲取DOMNodeList中的所有子節點並遍歷它們。但是當我循環使用DOMNode :: getNodeName()打印出節點名稱時,會打印字符串#Text。當試圖使用DOMNode :: getNodeValue()或DOMNode :: getTextContent()獲取值時,該字符串爲空。

例如:

xercesc::DOMNodeList *list = DOMDoc->getElementsByTagName(tagname); 

for(XMLSize_t i=0; i<list->getLength(); i++) { 
    if(list->item(i)->hasChildNode()) { 
     xercesc::DOMNodeList *children = nodeList->item(i)->getChildNodes(); 
     for(XMLSize_t j=0; j<list->getLength(); j++) { 
     xercesc::DOMNode *node = list->item(j); 
     XMLCh *name = node->getNodeName(); 
     XMLCh *value = node->getNodeValue(); 
     XMLCh *text = node->getTextContent(); 
     cout << "Name: " << xercesc::XMLString::Transcode(name) << endl; 
     cout << "Value: " << xercesc::XMLString::Transcode(value) << endl; 
     cout << "Text: " << xercesc::XMLString::Transcode(text) << endl; 
     } 
    } 
} 

OUTPUT: 

Name: #Text 
Value: 
Text: 

任何有識之士將不勝感激!

回答

0

默認情況下,xerces將空格(製表符,結束行和空格)視爲textNodes。 但是你可以設置下列選項解析器(從AbstractDOMParser繼承):

domParser.setIncludeIgnorableWhitespace(false); 

和解析過程中空格會被忽略。