ElementTree XPath - 根据属性选择元素
-
03-07-2019 - |
题
我在 ElementTree 中使用属性 XPath 选择器时遇到问题,我应该能够根据 文档
这是一些示例代码
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
我收到以下异常:
expected path separator ([)
解决方案
您尝试使用的语法是 ElementTree 1.3 中的新语法强>
此类版本附带 Python 2.7 或更高版本。 如果你有Python 2.6或更低版本,你仍然有ElementTree 1.2.6或更少。
其他提示
这段代码有几个问题。
Python 的内置 ElementTree(简称 ET)没有真正的 XPATH 支持;仅有限的子集 例如,它不支持 从根目录查找 表达如
//target
.注意:这 文档提到“//”,但仅适用于儿童:所以表达式为
.//target
已验证;//...
不是!有一个替代实现: lxml 哪个更丰富。对于内置代码来说,这是使用文档的接缝。那不匹配/工作。
这
@name
表示法选择 xml-属性;这key=value
xml 标签内的表达式。因此名称-值必须是 1 或 2 才能在给定文档中选择某些内容。或者,可以带着孩子搜索目标 元素 'A':
target[a]
(不 @)。
对于给定的文档,使用内置 ElementTree (v1.3) 解析为 root,以下代码是正确且有效的:
root.findall(".//target")
找到两个目标root.findall(".//target/a")
找到两个a元素root.findall(".//target[a]")
这会再次找到两个目标元素,因为两者都有一个 a 元素root.findall(".//target[@name='1']")
仅查找 第一的 目标。请注意,需要 1 左右的引号;否则会引发语法错误root.findall(".//target[a][@name='1']")
也有效;找到那个目标root.findall(".//target[@name='1']/a")
只找到一个 a 元素;...
不隶属于 StackOverflow