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

Rom*_*der 51 python xml elementtree

我正在使用Python在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>"
Run Code Online (Sandbox Code Playgroud)

我需要我的字符串包含以下XML声明:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
Run Code Online (Sandbox Code Playgroud)

但是,似乎没有任何记录的方法可以做到这一点.

是否有适当的方法来呈现XML声明ElementTree

wrg*_*grs 88

我很惊讶地发现似乎没有办法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
Run Code Online (Sandbox Code Playgroud)

看到这个问题.即便如此,我认为如果不自己编写前置文件,我也不会得到你的'独立'属性.

  • 谢谢这行et.write(f,encoding ='utf-8',xml_declaration = True)节省了我的一天 (4认同)

glo*_*mph 22

我会使用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))
Run Code Online (Sandbox Code Playgroud)


smr*_*chi 20

xml_declaration 参数

是否有正确的方法在 ElementTree 中呈现 XML 声明?

是的,并且不需要使用.tostring函数。根据ElementTree Documentation,您应该创建一个 ElementTree 对象,创建 Element 和 SubElements,设置树的 root,最后在函数xml_declaration中使用参数.write,以便声明行包含在输出文件中。

你可以这样做:

import xml.etree.ElementTree as ET

tree = ET.ElementTree("tree")

document = ET.Element("outer")
node1 = ET.SubElement(document, "inner")
node1.text = "text"

tree._setroot(document)
tree.write("./output.xml", encoding = "UTF-8", xml_declaration = True)  
Run Code Online (Sandbox Code Playgroud)

输出文件是:

<?xml version='1.0' encoding='UTF-8'?>
<outer><inner>text</inner></outer>
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,似乎是最“正确”的解决方案 (5认同)

Ale*_*ara 14

如果包含encoding='utf8',则会得到一个XML标头:

xml.etree.ElementTree.tostring使用encoding ='utf8'写入XML编码声明

示例Python 2代码:

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'))
Run Code Online (Sandbox Code Playgroud)

输出:

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

with:
<?xml version='1.0' encoding='utf8'?>
<xml><test>123</test></xml>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“utf8”不是有效的字符编码字符串。这也是 Python3 添加声明并将整个内容作为字节而不是字符串返回的原因。 (2认同)