我在ElementTree中使用属性XPath Selector时遇到问题,我应该可以根据文档来做
这是一些示例代码
XML
蟒蛇
def parse(document): root = et.parse(document) for target in root.findall("//target[@name='a']"): print target._children
我收到以下例外:
expected path separator ([)
Florian Bösc.. 34
您尝试使用的语法是ElementTree 1.3中的新增功能.
此版本随Python 2.7或更高版本一起提供.如果您使用的是Python 2.6或更低版本,那么您仍然可以使用ElementTree 1.2.6或更低版本.
您尝试使用的语法是ElementTree 1.3中的新增功能.
此版本随Python 2.7或更高版本一起提供.如果您使用的是Python 2.6或更低版本,那么您仍然可以使用ElementTree 1.2.6或更低版本.
这段代码有几个问题.
Python的buildin ElementTree(简称ET)没有真正的XPATH支持; 只有有限的子集例如,它不支持像root这样的find-from-root表达式//target
.
注意:文档
提到了" // ",但仅针对儿童:所以表达式
.//target
是有效的; //...
不是!
还有一种替代实现:lxml更丰富.对于内置代码,使用文档的接缝.那不符合/工作.
的@name
符号选择XML- 属性 ; key=value
xml-tag中的表达式.
因此,名称值必须为1或2才能选择给定文档中的内容.或者,可以使用子元素 "a"搜索目标:( target[a]
不是@).
对于给定的文档,使用内置的ElementTree(v1.3)解析为root,以下代码是正确的并且正常工作:
root.findall(".//target")
找到两个目标
root.findall(".//target/a")
找到两个a元素
root.findall(".//target[a]")
这会再次找到两个target-element,因为它们都有一个a元素
root.findall(".//target[@name='1']")
只找到第一个目标.请注意,需要大约1的引号; 否则会引发SyntaxError
root.findall(".//target[a][@name='1']")
也有效; 找到那个目标
root.findall(".//target[@name='1']/a")
只找到一个a元素; ...