如何在Python中写无头的XML文件?

13 投票
8 回答
10333 浏览
提问于 2025-04-15 23:18

在使用Python自带的XML工具,比如xml.dom.minidom来写XML文件时,文件总是会以这样的内容开头:

<?xml version="1.0"?>

[...]

虽然这段代码是合法的XML代码,而且推荐使用这个头部,但我想去掉它,因为我正在处理的一个程序在这里遇到了问题。

我找不到xml.dom.minidom中合适的选项来去掉这个头部,所以我想知道有没有其他的库可以不使用这个头部。

谢谢,

Nico

8 个回答

4

这个头部是在Document里面打印的。如果你直接打印这个节点,它是不会打印出头部的。

root = doc.childNodes[0]
root.toprettyxml(encoding="utf-8")
5

如果你想使用minidom并保持代码的美观,下面这个方法可以作为一个快速且简单的解决方案:

xml_without_declaration.py:

import xml.dom.minidom as xml

doc = xml.Document()

declaration = doc.toxml()

a = doc.createElement("A")
doc.appendChild(a)
b = doc.createElement("B")
a.appendChild(b)

xml = doc.toprettyxml()[len(declaration):]

print xml
19

很遗憾,minidom 这个工具不支持省略 XML 声明。

不过,你可以通过在文档的根元素上调用 toxml() 来自己生成文档内容,这样就不会有 XML 声明了:

xml= document.documentElement.toxml('utf-8')

...但是这样的话,你也不会得到根元素之外的任何东西,比如文档类型(DOCTYPE)、注释或者处理指令。如果你需要这些内容,就需要一个个地序列化文档对象的每个子元素:

xml= '\n'.join(node.toxml('utf-8') for node in document.childNodes)

我在想是否有其他工具可以省略这个头部信息。

DOM Level 3 LS 定义了一个 xml-declaration 配置参数,可以用来抑制这个声明。我知道的唯一一个支持这个的 Python 实现是 pxdom,它对标准的支持很全面,但速度并不快。

撰写回答