Python 如何使用XML.etree.ElementTree编写XML声明
我正在使用生成Python中的XML文档,但转换为纯文本时,Python 如何使用XML.etree.ElementTree编写XML声明,python,xml,elementtree,Python,Xml,Elementtree,我正在使用生成Python中的XML文档,但转换为纯文本时,tostring函数不包含 来自xml.etree.ElementTree导入元素,tostring 文档=元素(“外部”) 节点=子元素(文档“内部”) node.NewValue=1 打印到字符串(文档)#输出“” 我需要字符串包含以下XML声明: <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 然而,似乎没有任何记录在案的方法来做到这一点 是否有
tostring
函数不包含
来自xml.etree.ElementTree导入元素,tostring
文档=元素(“外部”)
节点=子元素(文档“内部”)
node.NewValue=1
打印到字符串(文档)#输出“”
我需要字符串包含以下XML声明:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
然而,似乎没有任何记录在案的方法来做到这一点
是否有适当的方法在ElementTree
中呈现XML声明?我将使用lxml(请参阅)
然后你可以:
from lxml import etree
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, xml_declaration=True))
我惊讶地发现,
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”属性就可以得到它。我最近遇到了这个问题,在对代码进行了一些挖掘之后,我发现下面的代码片段是function
ElementTree.write的定义
def write(self, file, encoding="us-ascii"):
assert self._root is not None
if not hasattr(file, "write"):
file = open(file, "wb")
if not encoding:
encoding = "us-ascii"
elif encoding != "utf-8" and encoding != "us-ascii":
file.write("<?xml version='1.0' encoding='%s'?>\n" %
encoding)
self._write(file, self._root, encoding, {})
def write(self、file、encoding=“us ascii”):
断言self.\u root不是None
如果不是hasattr(文件“写入”):
文件=打开(文件“wb”)
如果没有编码:
encoding=“us ascii”
elif编码!=“utf-8”和编码!=“us ascii”:
文件。写入(“\n”%
编码)
self.\u write(文件,self.\u根,编码,{})
因此,答案是,如果需要将XML头写入文件,请将编码
参数设置为非utf-8
或us ascii
,例如utf-8
我将使用:
如果您只想打印,则此选项有效。尝试将其发送到文件时出错
import xml.dom.minidom as minidom
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
def prettify(elem):
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
:
xml.etree.ElementTree.tostring使用encoding='utf8'编写xml编码声明
Python代码示例(适用于Python 2和Python 3):
ElementTree
包用法的最小工作示例:
import xml.etree.ElementTree as ET
document = ET.Element('outer')
node = ET.SubElement(document, 'inner')
node.text = '1'
res = ET.tostring(document, encoding='utf8', method='xml').decode()
print(res)
输出为:
<?xml version='1.0' encoding='utf8'?>
<outer><inner>1</inner></outer>
1.
在声明中包括“独立”
我在文档中找不到添加standalone
参数的替代方法,因此我修改了ET.tosting
函数,将其作为参数
from xml.etree import ElementTree as ET
# Sample
document = ET.Element('outer')
node = ET.SubElement(document, 'inner')
et = ET.ElementTree(document)
# Function that you need
def tostring(element, declaration, encoding=None, method=None,):
class dummy:
pass
data = []
data.append(declaration+"\n")
file = dummy()
file.write = data.append
ET.ElementTree(element).write(file, encoding, method=method)
return "".join(data)
# Working example
xdec = """<?xml version="1.0" encoding="UTF-8" standalone="no" ?>"""
xml = tostring(document, encoding='utf-8', declaration=xdec)
从xml.etree导入ElementTree作为ET
#样品
document=ET.Element(‘外部’)
node=ET.SubElement(文档“内部”)
et=et.ElementTree(文档)
#你需要的功能
def-tostring(元素、声明、编码=None、方法=None,):
类虚拟:
通过
数据=[]
data.append(声明+“\n”)
file=dummy()
file.write=data.append
ET.ElementTree(element).write(文件,编码,方法=method)
返回“”连接(数据)
#工作示例
xdec=“”
xml=tostring(文档,编码='utf-8',声明=xdec)
另一个非常简单的选项是将所需的头连接到xml字符串,如下所示:
xml = (bytes('<?xml version="1.0" encoding="UTF-8"?>\n', encoding='utf-8') + ET.tostring(root))
xml = xml.decode('utf-8')
with open('invoice.xml', 'w+') as f:
f.write(xml)
xml=(字节('\n',encoding='utf-8')+ET.tostring(根))
xml=xml.decode('utf-8')
将open('invoice.xml',w+')作为f:
f、 写入(xml)
简单
Python 2和3的示例(编码参数必须是utf8):
将xml.etree.ElementTree导入为ElementTree
tree=ElementTree.ElementTree(ElementTree.fromstring('123'))
root=tree.getroot()
打印(ElementTree.tostring(根,编码='utf8',方法='xml'))
Python3.8中有一个xml_声明参数:
版本3.8中的新功能:xml_声明和默认_命名空间
参数
xml.etree.ElementTree.tostring(element,encoding=“us ascii”,
method=“xml”,*,xml_声明=None,默认_名称空间=None,
short_empty_elements=True)生成XML的字符串表示形式
元素,包括所有子元素。元素是一个元素实例。
编码1是输出编码(默认为US-ASCII)。使用
encoding=“unicode”以生成unicode字符串(否则为
将生成bytestring)。方法是“xml”、“html”或“text”
(默认值为“xml”)。xml_声明、默认_名称空间和
short_empty_元素的含义与ElementTree.write()中的相同。
返回(可选)包含XML数据的编码字符串
Python 3.8及更高版本的示例:
import xml.etree.ElementTree as ElementTree
tree = ElementTree.ElementTree(ElementTree.fromstring('<xml><test>123</test></xml>'))
root = tree.getroot()
print(ElementTree.tostring(root, encoding='unicode', method='xml', xml_declaration=True))
将xml.etree.ElementTree导入为ElementTree
tree=ElementTree.ElementTree(ElementTree.fromstring('123'))
root=tree.getroot()
打印(ElementTree.tostring(root,encoding='unicode',method='xml',xml\u declaration=True))
xml\u声明参数
是否有适当的方法在ElementTree中呈现XML声明
是的,并且不需要使用.tostring
功能。根据,您应该创建一个ElementTree对象,创建元素和子元素,设置树的根,最后在函数中使用xml\u声明
参数,这样声明行就包含在输出文件中
您可以这样做:
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)
输出文件为:
<?xml version='1.0' encoding='UTF-8'?>
<outer><inner>text</inner></outer>
文本
这将是一个不错但脆弱的黑客攻击,但它似乎不起作用(在这之前,编码可能是小写的)。另外,ElementTree.ElementTree.write()
被记录为具有xml\u声明
paramater(请参阅接受的答案)。但是ElementTree.tostring()
没有该参数,这是原始问题中提出的方法。为什么在这里定义“node”变量?感谢这一行et.write(f,encoding='utf-8',xml_declaration=True)保存了my Day'et.write()有一个漂亮的打印参数吗?或者其他生成带换行符的xml的方法?@jan seins是的,请参见Python 3,在打印时声明中将显示转义字符
这个答案的帮助是想知道你为什么要做这么多的元素
xml = (bytes('<?xml version="1.0" encoding="UTF-8"?>\n', encoding='utf-8') + ET.tostring(root))
xml = xml.decode('utf-8')
with open('invoice.xml', 'w+') as f:
f.write(xml)
import xml.etree.ElementTree as ElementTree
tree = ElementTree.ElementTree(ElementTree.fromstring('<xml><test>123</test></xml>'))
root = tree.getroot()
print(ElementTree.tostring(root, encoding='utf8', method='xml'))
import xml.etree.ElementTree as ElementTree
tree = ElementTree.ElementTree(ElementTree.fromstring('<xml><test>123</test></xml>'))
root = tree.getroot()
print(ElementTree.tostring(root, encoding='unicode', method='xml', xml_declaration=True))
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)
<?xml version='1.0' encoding='UTF-8'?>
<outer><inner>text</inner></outer>