1

我必须解析格式错误的 XML:

>>> from lxml import etree
>>> root = etree.fromstring(xml_string)
XMLSyntaxError: Namespace prefix xlink for href on email is not defined, line 3, column 2446

xlink声明中确实缺少。

有没有一种简单、推荐的方法来告诉lxml忽略丢失的命名空间,或者使用提供的命名空间?

现在,我xml_string在解析之前手动修改注入命名空间,这可行,但丑陋且不够通用。

4

1 回答 1

3

没有办法告诉 lxml 插入缺少的命名空间声明。可以想象,

etree.register_namespace("xlink", "http://www.w3.org/1999/xlink")

可以帮助,但这没有效果。

即使它“丑陋”,我认为您必须在解析 XML 文档之前自己继续注入名称空间(如果您还没有的话,也许您可​​以自动执行此操作)。

可以通过使用初始化的解析器对象使 lxml 接受格式错误的输入recover=True。例子:

import lxml.etree as etree

INPUT = """\
<root>
 <x:a>ABC</x:a>
</root>""" 

parser = etree.XMLParser(recover=True)
tree = etree.fromstring(INPUT, parser)
print etree.tostring(tree)

输出:

<root>
 <a>ABC</a>
</root>

这里的前缀被简单地删除了,我认为这不是你想要的。命名空间的存在是有原因的;他们不能被扔掉。

于 2013-05-12T17:08:01.307 回答