在LXML中插入/忽略缺少的命名空间

时间:2013-05-08 16:50:32

标签: xml lxml xml-namespaces

我必须解析格式错误的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以在解析之前注入命名空间,这可行,但是很丑陋且不够通用。

1 个答案:

答案 0 :(得分:2)

无法告诉lxml插入缺少的命名空间声明。有人可能会想到

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

可能有所帮助,但这没有任何效果。

即使它是"丑陋",我认为在解析XML文档之前你必须自己继续注入命名空间(如果你还没有,你可以自动完成这个)。

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

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>

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