You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python xml.etree库write方法后XML前缀变更的原因及解决办法

XML命名空间前缀变更问题及解决方法

问题场景

原XML内容:

<ext:UBLExtensions xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
    <ext:UBLExtension>
        <ext:ExtensionContent>
        </ext:ExtensionContent>
    </ext:UBLExtension>
</ext:UBLExtensions>

执行以下未修改内容的Python代码:

import xml.etree.ElementTree as gfg

tree = gfg.parse('file_name.xml')
root = tree.getroot()
tree.write("file_name.xml")

保存后的XML前缀被自动替换为ns1:

<ns1:UBLExtensions>
    <ns1:UBLExtension>
        <ns1:ExtensionContent>
        </ns1:ExtensionContent>
    </ns1:UBLExtension>
</ns1:UBLExtensions>

原因分析

xml.etree.ElementTree解析XML时,核心关注的是命名空间的URI,而非前缀名称。它会自动将原前缀(如ext)映射到对应的URI,但默认不会保留原前缀的标识。当写入XML时,库会自动生成新的前缀(如ns1、ns2)来关联这些URI,导致原前缀被替换。

解决方法

通过register_namespace方法手动注册原前缀与对应URI的映射,让ElementTree在写入时使用指定的前缀:

修改后的代码

import xml.etree.ElementTree as gfg

# 注册原前缀和对应的命名空间URI(替换为你XML中实际的URI)
gfg.register_namespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2')

tree = gfg.parse('file_name.xml')
root = tree.getroot()
# 建议指定编码和XML声明,避免编码问题
tree.write("file_name.xml", encoding='utf-8', xml_declaration=True)

说明

  • 需将代码中的URI替换为原XML中ext前缀对应的实际命名空间(通常在根元素的xmlns:ext="..."属性中)。
  • register_namespace方法会告知ElementTree,在输出XML时对该URI使用你指定的前缀,从而保留原有的ext标识。

内容的提问来源于stack exchange,提问作者Selman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:30:31