我必须解析格式错误的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
以在解析之前注入命名空间,这可行,但是很丑陋且不够通用。
答案 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>
这里简单地删除了前缀,我不认为这就是你想要的。命名空间是有原因的;他们不能被抛弃。