使用find方法后获取父元素(xml.etree.ElementTree)

2024-04-28 23:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个巨大的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


Tags: 文件方法none信息tree元素rootxml
2条回答

xml.etreeAPI只支持有限版本的XPath。XPath表达式状态的^{} docs

Selects the parent element. Returns None if the path attempts to reach the ancestors of the start element (the element find was called on).

直接获取父元素是not supported in the ^{} API。因此,我建议使用^{},在这里您可以简单地使用^{}来获取父元素:

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

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

我有一个类似的问题,我有点创造性。结果没有什么能阻止我们自己添加亲子信息。一旦我们不再需要它,我们可以把它脱掉。

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

相关问题 更多 >