繁体   English   中英

ElementTree XPath - 根据属性选择元素

[英]ElementTree XPath - Select Element based on attribute

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

这是一些示例代码

XML

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

蟒蛇

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或更低版本。

这段代码有几个问题。

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

    注意: 文档提到了“ // ”,但只针对孩子:所以表达式为.//target是有效的; //...不是!

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

  2. @name表示法选择xml- 属性 ; xml-tag中的key=value表达式。

    因此,名称值必须为1或2才能选择给定文档中的内容。 或者,可以使用子元素 “a”搜索目标: target[a] (no @)。

对于给定的文档,使用内置的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元素; ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM