如何使用 lxml 解析包含前缀但没有命名空间声明的 XML?

Jon*_*let 6 python xml lxml xml-namespaces

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

像这样的东西:

<tal:block tal:condition="foo">
...
</tal:block>
Run Code Online (Sandbox Code Playgroud)

或者:

<div i18n:domain="my-app">
...
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

但 lxml 仍然窒息:

lxml.etree.XMLSyntaxError: Namespace prefix i18n for domain on div is not defined, line 4, column 20
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用ElementTree.XMLParser(recover=True),但无论如何我想保留前缀,而这种方法没有。

任何的想法?

Fra*_* IV 4

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

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