ElementTree XPath – 基于属性select元素

我在使用ElementTree中的属性XPath Selector时遇到了问题,根据文档我应该可以这样做

这是一些示例代码

XML

<root> <target name="1"> <a></a> <b></b> </target> <target name="2"> <a></a> <b></b> </target> </root> 

python

 def parse(document): root = et.parse(document) for target in root.findall("//target[@name='a']"): print target._children 

我收到以下exception:

 expected path separator ([) 

您尝试使用的语法在ElementTree 1.3中是新的。

这个版本随Python 2.7或更高版本一起提供。 如果你有Python 2.6或更less,你仍然有ElementTree 1.2.6或更less。

这个代码有几个问题。

  1. Python的buildin ElementTree(简称ET)没有真正的XPATH支持; 只有一个有限的子集例如,它不支持从/根目录查找expression式。

    注意: 文档中提到了“ // ”,但只限于儿童:所以expression式为.//target是有效的。 //...不是!

    还有一个替代实现: lxml更丰富。 这是使用文档的接缝,用于内置代码。 这不符合/工作。

  2. @name表示法selectxml- 属性 ; xml-tag中的key=valueexpression式。

    因此,名称值必须是1或2才能在给定的文档中select某些内容。 或者,可以search具有子元素 “a”的 target[a]target[a] (no @)。

对于给定的文档,用内置的ElementTree(v1.3)parsing为root,以下代码是正确的并且可以工作:

  • root.findall(".//target")find两个目标
  • root.findall(".//target/a")find两个元素
  • root.findall(".//target[a]")这又find了两个target元素,因为它们都有一个元素
  • root.findall(".//target[@name='1']")只查找第一个目标。 注意1左右的引号是必须的; 否则引发一个SyntaxError
  • root.findall(".//target[a][@name='1']")同样有效; find那个目标
  • root.findall(".//target[@name='1']/a")只查找一个a元素; …

看起来findall只支持一个子集XPath。 请参阅这里的邮件列表讨论