2

我已经使用 Element Tree 有一段时间了,我喜欢它,因为它很简单

但我怀疑它对 x 路径的实现

这是 XML 文件

<a>
  <b name="b1"></b>
  <b name="b2"><c/></b>
  <b name="b2"></b>
  <b name="b3"></b>
</a>

蟒蛇代码

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
root.findall("b[@name='b2' and c]")

程序显示错误:

invalid predicate

但是如果我使用

root.findall("b[@name='b2']") or 
 root.findall("b[c]")

有用,

4

2 回答 2

5

ElementTree 为 XPath 表达式提供有限的支持。目标是支持缩写语法的一小部分;完整的 XPath 引擎超出了核心库的范围。

(F. Lundh,ElementTree 中的 XPath 支持。)

对于支持 XPath (1.0) 的 ElementTree 实现,请查看LXML

>>> s = """<a>
  <b name="b1"></b>
  <b name="b2"><c /></b>
  <b name="b2"></b>
  <b name="b3"></b>
</a>"""
>>> from lxml import etree
>>> t = etree.fromstring(s)
>>> t.xpath("b[@name='b2' and c]")
[<Element b at 1340788>]
于 2012-06-11T14:58:11.160 回答
3

来自有关 XPath 支持的 ElementTree 文档。

ElementTree 为 XPath 表达式提供有限的支持。目标是支持缩写语法的一小部分;完整的 XPath 引擎超出了核心库的范围。

您刚刚发现了实现中的一个限制。您可以改用lxml;它提供了一个与 ElementTree 兼容的接口,具有完整的XPath 1.0 支持

于 2012-06-11T14:58:29.823 回答