【问题标题】:Python - Element Tree is removing the XML declarationPython - 元素树正在删除 XML 声明
【发布时间】:2012-09-27 01:06:23
【问题描述】:

我正在用元素树编写一些 XML。

我给代码一个空的模板文件,它以 XML 声明开头:<?xml version= "1.0"?>,当 ET 完成更改并写入完整的 XML 时,去除声明并从根标记开始。我怎样才能阻止这个?

写调用:

ET.ElementTree(root).write(noteFile)

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    根据the documentation

    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)。方法是“xml”、“html”或“text”(默认为“xml”)。返回一个编码字符串。

    所以,write(noteFile) 明确告诉它只有在编码不是 US-ASCII 或 UTF-8 并且编码是 US-ASCII 时才编写 XML 声明;因此,您不会得到任何声明。

    我猜如果你没有读这么多,你的下一个问题将是“为什么我的 Unicode 坏了”,所以让我们同时解决这两个问题:

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

    【讨论】:

    • 啊!好的,我没有意识到它正在完全修改文档 - 谢谢,知道这非常有用。
    • 嗯,由 ElementTree 实现决定是从头开始生成整个 XML 还是重用现有片段。我相信lxml 有一些非常智能的缓存,所以如果你只是读入一个小文件并将其写回,它会重用整个根节点。但是声明不是根节点的一部分,所以它确实无法绕过它。
    • 如果上述接受的解决方案不适合您,请检查@Olli 的答案,因为他的小调整挽救了我的一天
    【解决方案2】:

    ElementTree 有不同的版本。 有些接受xml_declaration 参数,有些不接受。

    我碰巧有的没有。当且仅当encoding != 'utf-8' 时,它才会发出声明。所以,为了得到声明,我打电话给write(filename, encoding='UTF-8')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2019-01-15
      相关资源
      最近更新 更多