XPath:查找具有特定属性的所有已知标记

时间:2017-11-16 10:27:14

标签: python xml xpath

我想从以下XML中使用Python获取所有trololo标记的列表,其中包含attr属性(但不是xxx或其他任何标记):

<data>
    <test>
        <trololo attr="1">
        </trololo>
    </test>
    <test>
        <trololo>
        </trololo>
    </test>
    <test>
        <trololo attr="X">
        </trololo>
    </test>
    <test>
        <xxx attr="Y">
        </xxx>
    </test>
</data>

我尝试过使用//*[@attr],但结果也包含xxx标记。我试过的所有其他变种到目前为止都失败了。

我正在使用的实际Python代码:

import xml.etree.ElementTree as ET
from pprint import pprint

tree  = ET.parse('test.xml')
nodes = tree.findall('//*trololo[@attr]')

pprint(nodes)

输出:

[]

更新:

我发现这是一个命名空间问题,这个问题是duplicate。问题是我的根节点看起来像这样:

<data xmlns="http://example.com">

1 个答案:

答案 0 :(得分:1)

具有命名属性的所有元素

作为@har07 correctly answers in the comments,XPath

//trololo[@attr]

将根据请求选择具有trololo属性的所有attr元素(无论其值如何)。

此字符串

//*trololo[@attr]

在语法上根本不是XPath表达式,但确实类似于

//*:trololo[@attr]

在XPath 2.0下语法无效(但不是XPath 1.0)。它说要在任何命名空间中选择trololol个元素。要忽略XPath 1.0(but you really shouldn't)中的命名空间,请使用local-name()

//*[local-name() = 'trololo' and @attr]

其他变体

  • 具有命名属性的所有元素: //*[@attr]
  • 包含任何属性的所有元素: //*[@*]