XPath搜索与ElementTree

4

我是一名新手,正在学习xml。希望能够使用XPath和Python ElementTree格式搜索xml文件。

<root>
<child>One</child>
<child>Two</child>
<child>Three</child>
</root>

搜索带有“Two”的子项,并返回true/false。

如果开始的方式如下:

from elementtree import ElementTree
root = ElementTree.parse(open(PathFile)).getroot()

如何实现这个目标?

2个回答

1

最近我一直在玩ElementTree,来看看吧..

>>> from xml.etree import ElementTree
>>> help(ElementTree.ElementPath)
>>> root = ElementTree.fromstring("""
<root><child>One</child><child>Two</child><child>Three</child></root>
""")
>>> ElementTree.ElementPath.findall(root, "child")
[<Element child at 2ac98c0>, <Element child at 2ac9638>, <Element child at 2ac9518>]
>>> elements = ElementTree.ElementPath.findall(root, "child")
>>> two = [x for x in elements if x.text == "Two"]
>>> two[0].text
'Two'

这就是你要找的吧?它说ElementPath只有有限的xpath支持,但并不是完全不支持。


"limited xpath support" ~= "一种极简化的查询语言,实际上并非真正的xpath,但有一些灵感来源" - Charles Duffy

1

当评估以下XPath表达式时:

    boolean(/*/*[.='Two'])

如果存在这样的元素(顶级元素的子元素,其字符串值等于“Two”),则结果为 true

否则为 false

希望这有所帮助。

祝好,

Dimitre Novatchev


Charles,众所周知,在已知文档结构的情况下使用“//”缩写是一种不良实践:会导致巨大的低效率。仅仅因为这个原因,你对一个比你的解决方案更优秀的解决方案进行了投票,这表明你在这个领域存在很大的问题。 - Dimitre Novatchev
关于在XML数据库中使用索引...你在原问题中看到了这样的提及吗?///x 的评估速度略快于 /nam1/name2/x,因为XPath引擎不必验证前两个位置步骤中的名称。抱歉,你又错了。干杯! - Dimitre Novatchev
Dimitre,//仅当深度超过1时才存在问题,而示例从未出现过-索引的XML文件将能够按名称搜索,而不是需要验证名称,使其更快-因此,更高效的解决方案取决于情况。 - Charles Duffy
如果只想验证这样的元素是否存在而不是查找元素本身以进行进一步检查,Dimitre在这里给出的答案比我的更好,因为它允许XPath引擎短路。 - Charles Duffy
Charles,即使对于最小深度//,这是一个不好的做法,因为人们可能会习惯于总是使用它。对于小型xml文件的索引值是最小的。再次强调,谁说文档是在xml数据库中维护的?这不是我们要解决的问题。 - Dimitre Novatchev
Dimitri,我们不知道它是在XML数据库中还是其他地方维护的;信息根本没有提供。你做出一个假设,我做出另一个假设——但在性能真正成为关键设计决策的情况下,很可能会使用索引的XML数据库。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接