使用XPath通过子节点获取父节点失败问题及解决方法
为什么
e.find('..')无法获取XML子节点的父元素?怎么解决? 问题原因
Python标准库的xml.etree.ElementTree模块中,find()方法仅支持当前节点的子节点路径查询,并不支持类似文件系统的..父节点跳转语法。这种语法是部分第三方XML解析库(比如lxml)的扩展特性,标准库ElementTree并未实现,因此调用child.find('..')会返回None。
解决方案
这里提供几种通用且实用的方法:
直接保存父节点引用
如果是简单场景,在获取子节点时直接保留父节点的引用即可:import xml.etree.ElementTree as etree xml = "<a> <b> </b> </a>" root = etree.fromstring(xml) child = root.find('*') parent = root # 直接保存父节点的引用 print(parent.tag) # 输出 'a'遍历树添加父节点属性
针对复杂XML结构,可以遍历整个树,给每个元素手动添加parent属性,实现通用的父节点访问:import xml.etree.ElementTree as etree xml = "<a> <b> <c></c> </b> </a>" root = etree.fromstring(xml) def set_parent(element, parent_node=None): element.parent = parent_node for child in element: set_parent(child, element) set_parent(root) # 任意子节点都能通过.parent获取父节点 grandchild = root.find('.//c') print(grandchild.parent.tag) # 输出 'b' print(grandchild.parent.parent.tag) # 输出 'a'使用lxml库(第三方方案)
如果你可以安装第三方库,lxml完全兼容..路径语法,直接调用find('..')就能获取父节点:from lxml import etree xml = "<a> <b> </b> </a>" root = etree.fromstring(xml) child = root.find('*') print(child.find('..').tag) # 输出 'a'
内容的提问来源于stack exchange,提问作者alfred
相关产品推荐
相关产品推荐

