使用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
相关产品推荐
相关产品推荐

