访问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为xmlvariables,您可以使用:

  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())