python 使用XPATH通过子节点获取父节点

mwyxok5s  于 2023-03-28  发布在  Python
关注(0)|答案(3)|浏览(358)

我试图使用e.find('..)'访问树中元素的父节点,但它不起作用。对于下面的代码:

import xml.etree.ElementTree as etree

xml = "<a> <b> </b> </a>"

root = etree.fromstring(xml)
child = root.find('*')

print(child.find('..'))

输出为:None,为什么?以及,我如何获得父元素(在本例中为node〈\a〉)?
我已经尝试了不同的路径组合,并在互联网上搜索,有些解决方案不起作用,有些是特定的问题。

de90aj5v

de90aj5v1#

您的代码段返回None,因为根的父级是根本身。
尝试lxml包,lxml是C库libxml2libxslt的Python绑定。它的独特之处在于它将这些库的速度和XML功能完整性与原生Python API的简单性相结合,大多数情况下兼容但上级着名的ElementTree API。
在你的情况下,我们可以这样做;

from lxml import etree  # pip install lxml

xml = "<a> <b> </b> </a>"

root = etree.fromstring(xml)

# Get the parent node of b
parent = root.xpath("//b/parent::*")

print(parent[0].tag)
cetgtptt

cetgtptt2#

使用包含XPath 1.0实现的lxml库:

>>> import lxml.etree as let
>>> doc = let.fromstring("<a> <b> </b> </a>")
>>> doc.xpath('//*[b]') # return all nodes with a direct `b` child
[<Element a at 0x7fffef3ed8c0>]
nkkqxpd9

nkkqxpd93#

可以使用ElementTree获取父对象,但不能直接在子对象上使用find()
该文件规定:
..选择父元素。如果路径试图到达起始元素的祖先(元素find被调用),则返回None
演示:

import xml.etree.ElementTree as etree

xml = "<a> <b> </b> </a>"

root = etree.fromstring(xml)
child = root.find('*')

# This does not work because we are calling find() on the child element
print(child.find('..'))   # None

# This works because we are calling find() on the root element
print(root.find("*/.."))  # <Element 'a' at 0x000002088B2B4B30>

相关问题