我想从以下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">
答案 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]
//*[@*]