如何使用xml.etree.ElementTree写XML声明

99 投票
11 回答
119365 浏览
提问于 2025-04-17 18:46

我正在用Python生成一个XML文档,使用的是ElementTree这个库,但在转换成纯文本时,tostring函数没有包含一个XML声明

from xml.etree.ElementTree import Element, tostring

document = Element('outer')
node = SubElement(document, 'inner')
node.NewValue = 1
print tostring(document)  # Outputs "<outer><inner /></outer>"

我希望我的字符串能包含以下的XML声明:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

不过,似乎没有任何文档说明怎么做到这一点。

有没有合适的方法可以在ElementTree中渲染XML声明呢?

11 个回答

25

如果你加上 encoding='utf8',你会得到一个 XML 头部

xml.etree.ElementTree.tostring 会写入一个 XML 编码声明,编码为 'utf8'

下面是一个示例 Python 代码(适用于 Python 2 和 3):

import xml.etree.ElementTree as ElementTree

tree = ElementTree.ElementTree(
    ElementTree.fromstring('<xml><test>123</test></xml>')
)
root = tree.getroot()

print('without:')
print(ElementTree.tostring(root, method='xml'))
print('')
print('with:')
print(ElementTree.tostring(root, encoding='utf8', method='xml'))

Python 2 的输出:

$ python2 example.py
without:
<xml><test>123</test></xml>

with:
<?xml version='1.0' encoding='utf8'?>
<xml><test>123</test></xml>

在 Python 3 中,你会注意到 有一个 b 前缀,这表示返回的是字节字面量(和 Python 2 一样):

$ python3 example.py
without:
b'<xml><test>123</test></xml>'

with:
b"<?xml version='1.0' encoding='utf8'?>\n<xml><test>123</test></xml>"
32

我会使用 lxml 这个库(可以查看 http://lxml.de/api.html)。

然后你可以:

from lxml import etree
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, xml_declaration=True))
144

我很惊讶地发现,似乎没有办法使用 ElementTree.tostring() 来实现这个功能。不过,你可以用 ElementTree.ElementTree.write() 把你的 XML 文档写入一个假文件:

from io import BytesIO
from xml.etree import ElementTree as ET

document = ET.Element('outer')
node = ET.SubElement(document, 'inner')
et = ET.ElementTree(document)

f = BytesIO()
et.write(f, encoding='utf-8', xml_declaration=True) 
print(f.getvalue())  # your XML file, encoded as UTF-8

可以参考 这个问题。即便如此,我觉得你还是需要自己手动添加 'standalone' 属性。

撰写回答