我有一个未知的XML结构,我希望找到包含Name
属性FooBar
的所有节点,这些节点不具有类似的祖先。也就是说,所有最高级别的匹配节点都不包括他们的孩子。
这是我用于查找具有匹配属性的节点的当前原型代码。 ElementTree没有完整的XPath实现,因此我们无法使用contains()
。
found = []
for node in root.iter():
if 'FooBar' in node.attrib.get('Name', ''):
found.append(node)
似乎有通过.find('..')
获取父级的方法,但是当您从开始的节点调用它时,这也会返回null
。
示例输入:
<root>
<ElementTypeA Name="..........FooBar.">
...
<ElementTypeB Name=".......FooBar......."/>
<ElementTypeC Name="...FooBar..........."/>
<ElementTypeD Name="....................."/>
<ElementTypeE Name="..........FooBar.">
.....
</ElementTypeE>
...
</ElementTypeA>
<ElementTypeF Name="...........">
<ElementTypeG Name="..........FooBar.">
...
<ElementTypeH Name=".......FooBar......."/>
<ElementTypeI Name="..........FooBar.">
.....
</ElementTypeI>
...
</ElementTypeG>
</ElementTypeF>
</root>
在上面的输入中,只应选择ElementTypeA和ElementTypeG。 ElementTypeE具有匹配的祖先,而ElementTypeF不匹配。
答案 0 :(得分:0)
这呼吁递归。
import xml.etree.ElementTree as ET
def recur(node):
# if this node is a foobar, return a one-item list containing it
if 'Name' in node.attrib:
if "FooBar" in node.attrib['Name']:
return [ node ]
# otherwise return a list of the results on the children
found = []
for child in node:
found += recur(child)
return found
tree = ET.parse('test.xml')
root = tree.getroot()
print(recur(root))
输出:
[<Element 'ElementTypeA' at 0x7f3890ef4dd0>, <Element 'ElementTypeG' at 0x7f3890eea310>]