我正在使用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
命名空间应该已经作为默认命名空间之一。
Namespace-well-formed XML,即uses定制名称空间也必须include名称空间声明本身。在第一个元素中添加xmlns
就足够了:
from lxml import etree
xml = """
<Foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='xsd:string'>bar</Foo>
"""
el = etree.fromstring(xml)
print (el)
因此,从技术上讲,如果您的XML使用xsi
但不包含名称空间声明,则它不是(名称空间)格式正确的XML。
另请参阅How to restrict the value of an XML element using xsi:type in XSD?