如何在Python中写无头的XML文件?
在使用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
,它对标准的支持很全面,但速度并不快。