如果我做对了,/
意味着它的权利节点必须是留给它的节点的直接子节点,例如/ul/li
返回作为文档根的ul项的直接子项的li项。 //ul//li
返回li项,它们是文档中某处的任何ul项的后代。
现在:/ul/li
是否比//ul//li
快,即使结果集相同?
答案 0 :(得分:3)
一般来说,是的,当然!
/ul/li
访问最多(number_of_ul * number_of_li个节点),最大深度为2. //ul//li
可能会访问文档中的每个节点。
但是,您可能正在使用带有某种索引的文档系统,或者您可能有一个文档,其中相同数量的节点最终被访问,或者其他什么,这可能使//
不那么慢或者与/ul/li
相同或甚至更快的速度。我想你也可能有一个超级哑的XPath实现,无论如何都会访问每个节点。
您应该描述您的具体情景,而不是问哪个更快。 “这取决于”是答案。
答案 1 :(得分:2)
可能至少有50个XPath实现,它们的性能差异很大,几个数量级。因此,在没有参考具体实现的情况下询问有关XPath性能的问题毫无意义。
通常,给出的建议是尽可能使用特定的路径:/ a / b / c / d优于// d。但是,这个建议并不总是正确的。有些产品会更快地执行,因为它们已经遇到了创建索引的麻烦:如果您针对XML数据库运行,则尤其如此。此外,表现并非一切。当您处理像FpML这样的复杂词汇表时,元素的特定路径很容易就是十步,名称平均为20个字符,所以这是一个200个字符的XPath,当你弄错它时很难发现。程序员性能比机器性能更重要。