使用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变动也不需要手动修改拼接逻辑:
- 先安装lxml库:
pip install lxml
- 修改代码:
# 仅修改导入语句,其余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
相关产品推荐
相关产品推荐

