You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:31:22