3

我找不到太多使用 xerces-c 3.1 评估 XPath 的示例。

给定以下示例 XML 输入:

<abc> 
    <def>AAA BBB CCC</def>
</abc>

我需要通过 XPath“/abc/def/text()[0]”检索“AAA BBB CCC”字符串。

以下代码有效:

XMLPlatformUtils::Initialize();
// create the DOM parser
XercesDOMParser *parser = new XercesDOMParser;
parser->setValidationScheme(XercesDOMParser::Val_Never);
parser->parse("test.xml");
// get the DOM representation
DOMDocument *doc = parser->getDocument();
// get the root element
DOMElement* root = doc->getDocumentElement();

// evaluate the xpath
DOMXPathResult* result=doc->evaluate(
    XMLString::transcode("/abc/def"), // "/abc/def/text()[0]"
    root,
    NULL,
    DOMXPathResult::ORDERED_NODE_SNAPSHOT_TYPE, //DOMXPathResult::ANY_UNORDERED_NODE_TYPE, //DOMXPathResult::STRING_TYPE,
    NULL);

// look into the xpart evaluate result
result->snapshotItem(0);
std::cout<<StrX(result->getNodeValue()->getFirstChild()->getNodeValue())<<std::endl;;

XMLPlatformUtils::Terminate();
return 0;

但我真的很讨厌这样:

result->getNodeValue()->getFirstChild()->getNodeValue()

它必须是一个节点集而不是我想要的确切节点吗?

我尝试了其他格式的 XPath,例如“/abc/def/text()[0]”和“DOMXPathResult::STRING_TYPE”。xerces 总是抛出异常。

我做错什么了?

4

1 回答 1

4

我没有使用 Xerces C++ 进行编码,但它似乎实现了 W3C DOM Level 3,因此基于此我建议选择一个具有类似路径的元素节点,/abc/def然后简单地访问result->getNodeValue()->getTextContent()以获取元素的内容(例如AAA BBB CCC)。

据我了解 DOM API,如果您想要一个字符串值,那么您需要使用路径string(/abc/def),然后result->getStringValue()应该这样做(如果该evaluate方法请求任何类型或 STRING_TYPE 作为结果类型)。

其他方法,如果您知道您只对文档顺序中的第一个节点感兴趣,您可以评估/abc/def然后FIRST_ORDERED_NODE_TYPE访问result->getNodeValue()->getTextContent()

于 2013-01-07T18:08:46.293 回答