Python XPath 的命名空间处理

2023-04-17 00:00:00 python 命名 空间

XPath 是一种用于在 XML 文档中定位节点的语言。但是当我们使用 XPath 查询带有命名空间的 XML 文档时,需要注意命名空间的处理。下面是 Python 中 XPath 处理命名空间的方法以及代码演示。

首先,我们需要导入 etree 模块:

from lxml import etree

下面是一个样例 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<pidan:book xmlns:pidan="https://pidancode.com">
  <pidan:title>Python 编程入门</pidan:title>
  <pidan:author>皮蛋编程</pidan:author>
</pidan:book>

在使用 XPath 查询时,我们需要先声明命名空间:

ns = {"pidan": "https://pidancode.com"}

这里我们使用了字典 ns,其中 key 是命名空间的前缀,value 是命名空间的 URI。

接着,我们可以使用如下方式进行 XPath 查询:

root.xpath("//pidan:title/text()", namespaces=ns)

这条 XPath 查询语句可以查询出 <pidan:title> 的文本内容。

完整的代码演示如下:

from lxml import etree

xml_str = '''<?xml version="1.0" encoding="UTF-8"?>
<pidan:book xmlns:pidan="https://pidancode.com">
  <pidan:title>Python 编程入门</pidan:title>
  <pidan:author>皮蛋编程</pidan:author>
</pidan:book>'''

root = etree.fromstring(xml_str)
ns = {"pidan": "https://pidancode.com"}

title = root.xpath("//pidan:title/text()", namespaces=ns)[0]
print(title)  # 输出:Python 编程入门

在这个样例中,我们使用 XML 字符串 xml_str 初始化了一个 Element 对象 root,然后声明了命名空间 ns,最后使用 XPath 查询得到了 <pidan:title> 的文本内容并打印输出。

需要注意的是,命名空间的解析顺序是从最接近节点的命名空间开始解析,因此 XPath 中的命名空间前缀要和 XML 文档中的一致。

相关文章