我正在使用 lxml 从具有命名空间的外部服务解析 XML,但未将它们注册到xmlns
。我正在尝试手动注册它register_namespace
,但这似乎不起作用。
from lxml import etree
xml = """
<Foo xsi:type="xsd:string">bar</Foo>
"""
etree.register_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance')
el = etree.fromstring(xml) # lxml.etree.XMLSyntaxError: Namespace prefix xsi for type on Foo is not defined
我缺少什么?奇怪的是,查看 lxml 源代码来尝试理解我可能做错了什么,似乎xsi
命名空间应该already作为默认命名空间之一。
当 XML 文档被解析并再次保存时,lxml 不会更改任何前缀(并且register_namespace
没有影响)。
如果您的 XML 文档没有声明其名称空间前缀,则它不是命名空间格式良好. Using register_namespace
解析之前无法修复此问题。
register_namespace
定义序列化新创建的 XML 文档时要使用的前缀。
实施例1(无register_namespace
):
from lxml import etree
el = etree.Element('{http://example.com}Foo')
print(etree.tostring(el).decode())
Output:
<ns0:Foo xmlns:ns0="http://example.com"/>
示例 2(其中register_namespace
):
from lxml import etree
etree.register_namespace("abc", "http://example.com")
el = etree.Element('{http://example.com}Foo')
print(etree.tostring(el).decode())
Output:
<abc:Foo xmlns:abc="http://example.com"/>
实施例3(无register_namespace
,但具有与常规前缀关联的“众所周知”命名空间):
from lxml import etree
el = etree.Element('{http://www.w3.org/2001/XMLSchema-instance}Foo')
print(etree.tostring(el).decode())
Output:
<xsi:Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)