解析前在lxml中注册名称空间

问题描述 投票:1回答:1

我正在使用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命名空间应该已经作为默认命名空间之一。

python xml lxml xml-namespaces
1个回答
1
投票

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?

© www.soinside.com 2019 - 2024. All rights reserved.