如何使用ElementTree查找所有顶级匹配节点?

时间:2015-03-09 20:12:35

标签: python xml elementtree

我有一个未知的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不匹配。

1 个答案:

答案 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>]