在解析之前使用 lxml 注册命名空间

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


大话西游666
浏览 253回答 2
2回答

PIPIONE

当 XML 文档被解析然后再次保存时,lxml 不会更改任何前缀(并且register_namespace没有效果)。如果您的 XML 文档未声明其命名空间前缀,则它不是命名空间格式良好的。在解析之前使用register_namespace无法解决此问题。register_namespace定义序列化新创建的 XML 文档时要使用的前缀。示例 1(不带register_namespace):from lxml import etreeel = etree.Element('{http://example.com}Foo')print(etree.tostring(el).decode())输出:<ns0:Foo xmlns:ns0="http://example.com"/>示例 2(带register_namespace):from lxml import etreeetree.register_namespace("abc", "http://example.com")el = etree.Element('{http://example.com}Foo')print(etree.tostring(el).decode())输出:<abc:Foo xmlns:abc="http://example.com"/>示例 3(没有register_namespace,但具有与常规前缀关联的“知名”命名空间):from lxml import etreeel = etree.Element('{http://www.w3.org/2001/XMLSchema-instance}Foo')print(etree.tostring(el).decode())输出:<xsi:Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

慕无忌1623718

使用自定义命名空间的命名空间格式良好的XML还必须包含命名空间声明本身。在第一个元素中添加一个xmlns就足够了:from lxml import etreexml = """&nbsp; &nbsp; <Foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='xsd:string'>bar</Foo>"""el = etree.fromstring(xml)&nbsp; &nbsp;&nbsp;print (el)因此,从技术上讲,如果您的 XML 使用xsi但不包含命名空间声明,则它不是(命名空间)格式良好的 XML。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python