我使用Xerces C ++ API编写了一个XML解析器。我有获取节点值的方法似乎间歇性地工作,我不知道为什么。
我是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>
例如,我想在“MsgHeader”下查找“Fgc”的值。我可以使用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 :(得分:1)
默认情况下,xerces将空格(制表符,结束行和空格)视为textNodes。 但是您可以为解析器设置以下选项(继承自AbstractDOMParser):
domParser.setIncludeIgnorableWhitespace(false);
在解析过程中会忽略空格。