使用 Python Etree 解析 XML 并返回指定的标签而不考虑命名空间

Posted

技术标签:

【中文标题】使用 Python Etree 解析 XML 并返回指定的标签而不考虑命名空间【英文标题】:Parse XML with Python Etree and Return Specified Tag Regardless of Namespace 【发布时间】:2012-01-02 05:44:01 【问题描述】:

我正在处理一些 XML 数据,这些数据在每个文件的某些位置重新定义了命名空间。我正在尝试从文档中提取特定类型的所有标签,而不管在标签驻留在 XML 中的位置处于活动状态的命名空间如何。

我正在使用findall('.//namespaceTag') 来查找我正在寻找的元素。但是永远不知道namespace 在文件中的任何给定点是什么,无论我是否会返回所有请求的标签,都会让它命中或错过。

有没有办法返回所有标签元素,而不管它们属于哪个namespace?类似于findall('.//wildcardTag') 的东西?

【问题讨论】:

鉴于这个问题已经有一段时间没有得到答案,这里有一些建议。如果你已经解决了你的问题,太好了!但请务必在此处发布,以免我们手头上出现Fermat thread。如果没有,问题的代码和 XML 示例会很方便。 【参考方案1】:

lxml的xpath函数支持local-name()!

这是一个 Python 3 示例:

import io
from lxml import etree
xmlstring = '''<root
xmlns:m="http://www.w3.org/html4/"
xmlns:n="http://www.w3.org/html5/">
<m:table>
  <m:tr>
    <m:name>Sometext</m:name>
  </m:tr>
</m:table>
<n:table>
  <n:name>Othertext</n:name>
</n:table>
</root>'''
root = etree.parse(io.StringIO(xmlstring))
names = root.xpath("//*[local-name() = 'name']")
for name in names:
    print(name.text)

您的问题之前可能已在lxml etree xmlparser namespace problem

【讨论】:

这个输出是什么。你跑了吗?不确定这是否真的有效。 我收到此错误:Traceback(最近一次调用最后一次):文件 xml_test.py”,第 15 行,在 root = etree.parse(io.StringIO(xmlstring)) 类型错误:initial_value必须是 unicode 或 None,而不是 str 实际输出的是“Sometext\nOthertext\n”

以上是关于使用 Python Etree 解析 XML 并返回指定的标签而不考虑命名空间的主要内容,如果未能解决你的问题,请参考以下文章

使用 xml.etree.ElementTree 在 python 中解析 XML

如何使用 python xml.etree.ElementTree 解析 eBay API 响应?

Python连载45-XML解析(使用minidom和etree分别示例)

python xml解析之 xml.etree.ElementTree

Python解析xml文件

python解析XML笔记(etree)