gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:46:33 25 4
gpt4 key购买 nike

我正在使用 lxml 从具有 namespace 的外部服务中解析 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 命名空间应该 已经 作为默认命名空间之一命名空间。

最佳答案

当一个 XML 文档被解析然后再次保存时,lxml 不会更改任何前缀(并且 register_namespace 没有效果)。

如果您的 XML 文档没有声明其命名空间前缀,则它不是命名空间格式良好的。在解析之前使用 register_namespace 无法解决此问题。


register_namespace 定义序列化新创建的 XML 文档时要使用的前缀。

示例 1(没有 register_namespace):

from lxml import etree

el = etree.Element('{http://example.com}Foo')
print(etree.tostring(el).decode())

输出:

<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())

输出:

<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())

输出:

<xsi:Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

关于python - 在解析之前使用 lxml 注册命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59850806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com