【问题标题】:Get parent element after using find method (xml.etree.ElementTree)使用 find 方法后获取父元素(xml.etree.ElementTree)
【发布时间】:2014-08-06 00:38:46
【问题描述】:

我正在处理一个巨大的 xml 文件并尝试从不同的元素中提取信息。

import xml.etree.ElementTree as ET
tree = ET.parse('t.xml')
root = tree.getroot()

要查找元素,我使用 find 方法:

elm = root.find('.//Element[@elmid="1234"]')

我从中提取信息,此外我还需要来自父元素的信息。但elm.find('..') 仅返回None,如此处所述: https://docs.python.org/3/library/xml.etree.elementtree.html

现在我使用以下:

prt = root.find('.//Element[@elmid="1234"]/..')     
elm = prt.find('/Element[@elmid="1234"]')

这对我来说看起来有点不自然,但很有效。

您知道更好的方法吗? 你知道为什么只返回None吗?

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    我遇到了类似的问题,我有点创意。事实证明,没有什么能阻止我们自己添加亲子信息。一旦我们不再需要它,我们可以稍后将其剥离。

    def addParentInfo(et):
        for child in et:
            child.attrib['__my_parent__'] = et
            addParentInfo(child)
    
    def stripParentInfo(et):
        for child in et:
            child.attrib.pop('__my_parent__', 'None')
            stripParentInfo(child)
    
    def getParent(et):
        if '__my_parent__' in et.attrib:
            return et.attrib['__my_parent__']
        else:
            return None
    
    tree = ...
    addParentInfo(tree.getroot())
    el = tree.findall(...)[0]
    parent = getParent(el)
    while parent:
        ...
        parent = getParent(parent)
    ...
    stripParentInfo(tree.getroot())
    

    【讨论】:

      【解决方案2】:

      xml.etree API 仅支持有限版本的 XPath。 xml.etree docs.. XPath 表达式状态:

      选择父元素。 如果路径尝试返回 None 到达起始元素的祖先(元素 find 被称为 开)。

      直接获取父元素是not supported in the xml.etree API。因此,我建议使用lxml,您可以简单地使用getparent() 来获取父元素:

      elm = root.find('.//Element[@elmid="1234"]')
      elm.getparent()
      

      lxml 也有一个完整的XPath 1.0 implementation,所以elem.xpath('..') 也可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 2013-12-28
        相关资源
        最近更新 更多