访问ElementTree节点的父节点
我正在使用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}