访问ElementTree节点父节点
我正在使用内置的Python ElementTree模块。 访问孩子很简单,但父母或兄弟节点呢? – 这可以有效地完成,无需遍历整个树?
没有以parent
属性的forms直接支持,但也可以使用这里描述的模式来达到预期的效果。 build议使用以下单行(从链接到文章)为整棵树创build子对父映射:
parent_map = dict((c, p) for p in tree.getiterator() for c in p)
Vinay的答案应该仍然有效,但对于Python 2.7+和3.2+,推荐以下内容:
parent_map = {c:p for p in tree.iter() for c in p}
getiterator()
不赞成使用iter()
,而且使用新的dict
列表理解构造函数是很好的。
其次,在构build一个XML文档时,一个孩子可能会有多个父母,尽pipe在序列化文档后会被删除。 如果这很重要,你可以试试这个:
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
您可以在ElementTree中使用xpath ...
表示法。
<parent> <child id="123">data1</child> </parent> xml.findall('.//child[@id="123"]...') >> [<Element 'parent'>]
正如在使用find方法(xml.etree.ElementTree)之后获取父元素所述,您将不得不间接search父项。 有xml:
<a> <b> <c>data</c> <d>data</d> </b> </a>
假设您已经将etree元素创build为xml
variables,您可以使用:
In[1] parent = xml.find('.//c/..') In[2] child = parent.find('./c')
导致:
Out[1]: <Element 'b' at 0x00XXXXXX> Out[2]: <Element 'c' at 0x00XXXXXX>
更高的父级将被找到: secondparent=xml.find('.//c/../..')
是<Element 'a' at 0x00XXXXXX>
另一种方法,如果只想要一个单独的子元素的父母,也知道子元素的xpath。
parentElement = subElement.find(xpath+"/..")
如果你正在使用lxml,我可以通过以下方法获得父元素:
parent_node = next(child_node.iterancestors())