python - 如何使用 lxml 解析包含前缀但没有 namespace 声明的 XML?

标签 python xml lxml xml-namespaces

我有一堆使用前缀但没有相应命名空间声明的 XML 文件。

类似的东西:

<tal:block tal:condition="foo">
...
</tal:block>

或:

<div i18n:domain="my-app">
...

我知道这些前缀是从哪里来的,我尝试了以下方法,但没有成功:

from lxml import etree as ElementTree

ElementTree.register_namespace("i18n", "http://namespaces.zope.org")
ElementTree.register_namespace("tal", "http://xml.zope.org/namespaces/tal")

with open(path) as fp:
    tree = ElementTree.parse(fp)

但是 lxml 仍然因为以下问题而窒息:

lxml.etree.XMLSyntaxError: Namespace prefix i18n for domain on div is not defined, line 4, column 20

我知道我可以使用 ElementTree.XMLParser(recover=True),但无论如何我都想保留前缀,而此方法不会。

有什么想法吗?

最佳答案

它不是有效的 XML,使用未定义的前缀,因此没有 XML 解析器能够处理它。

您最好的选择(除了修复 XML 之外)是以编程方式修改 XML 源以将 namespace 属性添加到根元素(只需使用您的语言中的字符串支持)。在将 XML 提供给解析器之前,将 xmlns:tal="http://xml.zope.org/namespaces/tal" 等添加到根元素。然后 XML 解析器应该毫无怨言地处理它,也不会注册任何 namespace 。

关于python - 如何使用 lxml 解析包含前缀但没有 namespace 声明的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10393435/

相关文章:

python - numpy 排列和位置

不考虑字符序列的 Python 字符串搜索

python - 使用 numpy einsum 将向量列表乘以一个矩阵

xml - 将xslt 2.0转换为xslt 1

xml - 谁是对的,谁做了错误的验证(我、XMLSpy、lxml.etree 或 xmllint)

php - 分阶段将 PHP 转换为 django

java - 如何从 xml java 中搜索并删除某些值

objective-c - merge Xcode 项目文件

python - 修复无效的 xml 字符

python - 使用 lxml 时 https 有什么问题?