xpath上元素树的限制

时间:2012-06-11 14:54:31

标签: python xml xpath elementtree

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

但我怀疑它的x路径实现

这是XML文件

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

python代码

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]")

有效,

2 个答案:

答案 0 :(得分:5)

  

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

(F.Lundh,XPath Support in ElementTree。)

对于支持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>]

答案 1 :(得分:3)

来自ElementTree documentation on XPath support.

  

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

您刚刚发现了实施方面的限制。您可以使用lxml代替;它提供了一个ElementTree兼容的接口,其中包含完整的XPath 1.0 support