TinyXPath 的占用空间小,使其成为用于简单 XPath 查询的有吸引力的包。然而,它的一些功能似乎不像一个(新手)所期望的那样工作。具体来说,我似乎无法获得特定(非根)节点的琐碎后代的匹配。这个问题涉及一个几乎相同的问题,但是当 XPath 表达式针对最近的孩子之外的后代时,建议的答案不起作用。
示例输入(test.xml):
<A>
<B val="123">
<C>
<D val="321">123</D>
<E>e</E>
</C>
<F>f</F>
</B>
<C>
<D val="432">d1</D>
</C>
</A>
代码:
#include "xpath_static.h"
int mainSO()
{
TiXmlDocument doc;
if(doc.LoadFile("test.xml")) {
TiXmlNode* pRoot = doc.RootElement();
assert(pRoot);
const TiXmlNode* pChild(nullptr);
TinyXPath::o_xpath_node(pRoot, "/A/B", pChild); // OK! Root-relative expressions work.
const TiXmlNode* pChild2(nullptr);
TinyXPath::o_xpath_node(pChild, "C", pChild2); // OK!
const TiXmlNode* pChild3(nullptr);
TinyXPath::o_xpath_node(pChild, "C/D", pChild3); // Fail!
// TinyXPath::o_xpath_node(pChild, ".C/D", pChild3); // Fail!
// TinyXPath::o_xpath_node(pChild, ".//C/D", pChild3); // Fail!
}
return 0;
}
o_xpath_node 内部的 xpath_processor 没有报错;根本没有匹配项。
我也尝试了这个答案中的公式——它确实返回了一个匹配项,但是它只返回节点 C,而不是 C/D。
有人有类似的问题吗?我是否错误地格式化了 XPath 表达式?
我曾希望 TinyXPath 文档可以提供一些指示,但是...
文档!是!斯巴达!
干杯,
克拉斯