如何为现有XML文件添加命名空间并正确输出修改后的内容
问题原因
你写的代码存在两个核心错误,导致输出和原文件一致:
- 你对
root变量重新赋值为新建的空Element对象,仅修改了变量的指向,完全没有改动原解析得到的document对象内的根节点内容 - 你新建的根节点没有迁移原根节点下的所有内容,就算替换成功也会丢失原有数据
正确实现代码
from lxml import etree # 定义命名空间和属性 schema_loc = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation") ns_map = { None: "urn:myname", "xsi": "http://www.w3.org/2001/XMLSchema-instance" } # 解析原文件 document = etree.parse(self.fname) old_root = document.getroot() # 新建符合要求的根节点 new_root = etree.Element( "abcd", {schema_loc: "urn:myname myname.xsd"}, nsmap=ns_map ) # 迁移原根节点的文本、属性、子节点 new_root.text = old_root.text new_root.tail = old_root.tail # 如需保留原根节点的其他自定义属性,打开下一行注释 # new_root.attrib.update(old_root.attrib) for child in old_root: new_root.append(child) # 替换原文档的根节点 document._setroot(new_root) # 输出修改后的内容 print("修改结果:", etree.tostring(document, pretty_print=True, encoding="utf-8").decode())
补充说明
如果需要将修改后的内容写入文件,直接调用document.write(输出路径, pretty_print=True, encoding="utf-8")即可。
内容的提问来源于stack exchange,提问作者nayang
相关产品推荐
相关产品推荐

