ElementTree XPath - 根据属性选择元素

问题描述 投票:0回答:2
python elementtree
2个回答
36
投票

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

此类版本随 Python 2.7 或更高版本一起提供。 如果您有 Python 2.6 或更低版本,您仍然拥有 ElementTree 1.2.6 或更低版本。


34
投票

这段代码有几个问题。

  1. Python 的内置 ElementTree(简称 ET)没有真正的 XPATH 支持;仅有限的子集 例如,它不支持 find-from-root 表达式,例如

    //target

    注意:文档 提到“//”,但仅适用于儿童:因此表达式为

    .//target
    有效;
    //...
    不是!

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

  2. @name
    表示法选择xml-attributes; xml 标签内的
    key=value
    表达式。

    因此名称-值必须为 1 或 2 才能在给定文档中选择某些内容。或者,可以搜索带有子 element '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']")
    仅查找 first 目标。请注意,需要 1 左右的引号;否则会引发语法错误
  • root.findall(".//target[a][@name='1']")
    也有效;找到那个目标
  • root.findall(".//target[@name='1']/a")
    仅查找一个 a 元素; ...
© www.soinside.com 2019 - 2024. All rights reserved.