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

使用xml.etree.ElementTree写入XML丢失头部和DOCTYPE的解决方法咨询

Python修改XML后保留头部声明与DOCTYPE的解决方案

问题原因

Python标准库的xml.etree.ElementTree模块默认不会解析和存储XML文件中的DOCTYPE信息,因此修改后写入文件时会丢失该部分内容。你代码中已经添加了xml_declaration=True参数,已经可以保留XML头部声明,仅需补充DOCTYPE的写入逻辑即可。

解决方案

方案1:使用标准库手动拼接DOCTYPE(无需安装额外依赖)

直接替换原有tree.write部分的代码,手动将固定的DOCTYPE内容插入到生成的XML内容中即可,适合你的DOCTYPE固定不变的场景:

import xml.etree.ElementTree as ET
from dictionary import getDict
from Dict_manufacturers import getDict_manu

def VehiclesInput(UAMtype):
    tree = ET.parse('muc_network_s_od_2_v_uam_vehicles.xml')
    root = tree.getroot()
    
    # 原有修改属性值的逻辑保持不变
    # if ...(editing values) 

    # 替换原有write逻辑
    # 生成带XML声明的字节内容
    xml_bytes = ET.tostring(root, encoding='UTF-8', xml_declaration=True)
    # 定义你的DOCTYPE内容
    doctype = b'<!DOCTYPE uam SYSTEM "src/main/resources/dtd/uam.dtd">\n'
    # 插入DOCTYPE到XML声明之后
    final_xml = xml_bytes.replace(b'?>', b'?>\n' + doctype, 1)
    # 写入文件
    with open('muc_network_s_od_2_v_uam_vehicles.xml', 'wb') as f:
        f.write(final_xml)
    
    return

方案2:使用lxml库自动处理(兼容性更强)

lxml是兼容ElementTree API的第三方XML处理库,原生支持保留DOCTYPE信息,仅需修改导入语句和写入参数即可,后续如果DOCTYPE变动也不需要手动修改拼接逻辑:

  1. 先安装lxml库:
pip install lxml
  1. 修改代码:
# 仅修改导入语句,其余API和ElementTree完全一致
from lxml import etree as ET
from dictionary import getDict
from Dict_manufacturers import getDict_manu

def VehiclesInput(UAMtype):
    tree = ET.parse('muc_network_s_od_2_v_uam_vehicles.xml')
    root = tree.getroot()
    
    # 原有修改属性值的逻辑保持不变
    # if ...(editing values) 

    # 写入时自动保留原有的DOCTYPE,也可以手动指定doctype参数
    tree.write(
        'muc_network_s_od_2_v_uam_vehicles.xml',
        encoding = "UTF-8",
        xml_declaration = True
    )
    
    return

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:06:07