Python - Element Tree正在移除XML声明

12
我正在使用ElementTree编写一些XML。 我提供了一个以XML声明开始的空模板文件:<?xml version= "1.0"?> 当ET完成对XML的更改并写入完整的XML时,它会剥离声明并以根标签开始。我该如何阻止这种情况发生?
写入调用代码如下:ET.ElementTree(root).write(noteFile)
2个回答

26

根据文档:

write(file, encoding="us-ascii", xml_declaration=None, method="xml")

将元素树以XML格式写入文件中。file是文件名或已打开的写入模式文件对象。encoding 1 是输出编码(默认为US-ASCII)。xml_declaration控制是否向文件添加XML声明。使用False表示从不,True表示始终添加,None表示仅在不是US-ASCII或UTF-8时添加(默认为None)。method可以是“xml”、“html”或“text”(默认为“xml”)。返回编码后的字符串。

因此,write(noteFile)显式告诉它只有当编码不是US-ASCII或UTF-8时才写入XML声明,并且编码为US-ASCII;因此,您没有得到声明。

我猜如果您没有阅读这么多内容,您下一个问题将是“为什么我的Unicode被破坏了”,所以我们一起解决这个问题:

ET.ElementTree(root).write(noteFile, encoding="utf-8", xml_declaration=True)

啊!好的,我没有意识到它完全改变了文档 - 谢谢,这非常有用。 - Jay Gattuso
1
好的,生成整个XML文件还是重用现有部分取决于ElementTree实现。我相信lxml有一些非常智能的缓存机制,因此如果您只读取一个小文件并将其写回,它会重用整个根节点。但声明不是根节点的一部分,所以它真的无法避免这种情况。 - abarnert
如果上面的接受的解决方案对您不起作用,请检查@Olli的答案,因为他的小调整救了我的一天。 - ToTenMilan

6

有不同版本的ElementTree。 其中一些版本接受xml_declaration参数,而其他版本则不接受。

我所使用的版本没有这个参数。只有当encoding != 'utf-8'时,它才会生成声明。因此,要获得声明,我调用write(filename, encoding='UTF-8')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接