如何使用xml.etree.ElementTree写XML声明
我正在用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' 属性。