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

yoo*_*poo 8 python xml elementtree

我正在使用一个巨大的xml文件,并尝试从不同的元素中提取信息.

import xml.etree.ElementTree as ET
tree = ET.parse('t.xml')
root = tree.getroot()
Run Code Online (Sandbox Code Playgroud)

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

elm = root.find('.//Element[@elmid="1234"]')
Run Code Online (Sandbox Code Playgroud)

从这里我提取信息,此外我需要来自父元素的信息.但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"]')
Run Code Online (Sandbox Code Playgroud)

这看起来有点不自然,但有效.

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

Luk*_*raf 15

xml.etreeAPI仅支持XPath的有限版本.该xml.etree文档..XPath表达式状态:

选择父元素.如果路径尝试到达start元素的祖先(调用元素find),则返回None.

API 不支持xml.etree直接获取父元素.因此我建议使用lxml,您只需使用它getparent()来获取父元素:

elm = root.find('.//Element[@elmid="1234"]')
elm.getparent()
Run Code Online (Sandbox Code Playgroud)

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