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。
这个代码有几个问题。
-
Python的buildin ElementTree(简称ET)没有真正的XPATH支持; 只有一个有限的子集例如,它不支持从/根目录查找expression式。
注意: 文档中提到了“ // ”,但只限于儿童:所以expression式为
.//target
是有效的。//...
不是!还有一个替代实现: lxml更丰富。 这是使用文档的接缝,用于内置代码。 这不符合/工作。
-
@name
表示法selectxml- 属性 ; xml-tag中的key=value
expression式。因此,名称值必须是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。 请参阅这里的邮件列表讨论