TinyXPath的占地面积小,使其成为简单的XPath查询的有吸引力的包。然而,它的一些功能似乎不像一个人(新手)期望的那样工作。具体来说,我似乎无法获得特定(非根)节点的琐碎后代的匹配。 This question关于一个几乎相同的问题,但是当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报告没有错误;根本就没有比赛。
我还尝试了this回答中的表达式 - 它确实返回了匹配项,但它只返回节点C,而不是C / D.
有人有过类似的问题吗?我错误格式化了XPath表达式吗?
我曾希望TinyXPath文档可以给出一些指示,但是......
文档!是!斯巴达!的
干杯,
克拉斯
答案 0 :(得分:1)
在我的情况下为了别人的利益,我想回答我自己的问题。
这个问题一直是TinyXPath的一个长期问题,正如this thread on the TinyXPath discussion forum中所讨论的那样。
这个问题最终由安东尼·安苏特解决了TinyXPath TinyXPath inofficial version 1.3.2(这实际上是我发现的这个“发布”的唯一链接)。