访问ElementTree节点的父节点

89 投票
12 回答
102108 浏览
提问于 2025-04-15 18:41

我正在使用Python自带的ElementTree模块。访问子节点很简单,但要访问父节点或兄弟节点呢?有没有什么高效的方法可以做到,而不需要遍历整个树呢?

12 个回答

28

你可以在ElementTree中使用xpath ... 这种表示法。

<parent>
     <child id="123">data1</child>
</parent>

xml.findall('.//child[@id="123"]...')
>> [<Element 'parent'>]
32

Vinay的回答应该还是有效的,但对于Python 2.7以上和3.2以上的版本,推荐使用以下方法:

parent_map = {c:p for p in tree.iter() for c in p}

getiterator()这个方法已经不推荐使用了,建议用iter()来代替。而且,使用新的dict列表推导式构造器会更方便。

其次,在构建XML文档时,可能会出现一个子元素有多个父元素的情况,不过在你把文档序列化(转换成字符串)后,这种情况会被去掉。如果这对你很重要,可以试试这个方法:

parent_map = {}
for p in tree.iter():
    for c in p:
        if c in parent_map:
            parent_map[c].append(p)
            # Or raise, if you don't want to allow this.
        else:
            parent_map[c] = [p]
            # Or parent_map[c] = p if you don't want to allow this
71

这里没有直接的支持,比如说没有一个叫做 parent 的属性。不过,你可以试试这里描述的模式,来达到你想要的效果。下面这个一行代码是推荐的(已经更新到Python 3.8),它可以为整个树结构创建一个子节点到父节点的映射,使用的方法是 xml.etree.ElementTree.Element.iter

parent_map = {c: p for p in tree.iter() for c in p}

撰写回答