[英]How to parse XML containing prefixes but no namespace declarations with lxml?
我有一堆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源以将命名空间属性添加到根元素(只使用您的语言中的字符串支持)。 在将XML提供给解析器之前,将xmlns:tal="http://xml.zope.org/namespaces/tal"
等添加到根元素。 然后,XML解析器应该无需投诉地处理它,也没有任何注册命名空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.