【问题标题】:xerces-c 3.1 XPath evaluationxerces-c 3.1 XPath 评估
【发布时间】:2013-01-07 17:06:55
【问题描述】:

我找不到太多使用 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 总是抛出异常。

我做错了什么?

【问题讨论】:

    标签: xpath xerces-c


    【解决方案1】:

    我没有使用 Xerces C++ 编写代码,但它似乎实现了 W3C DOM Level 3,因此基于此我建议选择具有类似 /abc/def 的路径的元素节点,然后只需访问 result-&gt;getNodeValue()-&gt;getTextContent() 即可获得元素的内容(例如AAA BBB CCC)。

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

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

    【讨论】:

    • result->getStringValue() 总是抛出,无论什么 TYPE 被传递到 evaluate()。结果->getNodeValue()->getTextContent() 有效。谢谢
    • 如果有一个 XPath 来使 result->getStringValue() 工作,那就太好了。有人知道怎么做吗?
    • @JohnCrane 有没有办法知道文档是否归解析器所有?你能看看这个问题吗..stackoverflow.com/questions/23673300/…
    猜你喜欢
    • 2018-01-01
    • 2010-11-03
    • 1970-01-01
    • 2018-03-31
    • 2013-07-13
    • 2022-08-24
    • 2010-11-09
    • 2013-07-16
    • 2021-10-03
    相关资源
    最近更新 更多