Python / XML:漂亮的打印ElementTree

时间:2018-04-23 21:46:15

标签: python xml python-2.7 pretty-print

我使用The ElementTree XML API构建XML,我希望能够漂亮地打印

  • 个别节点(供检查)以及
  • 整个文件(到文件,以备将来检查)。

我可以使用ET.write()将我的XML写入文件,然后使用Pretty printing XML in Python中的许多建议对其进行漂亮打印。但是,这需要我序列化然后反序列化XML(到磁盘或StringIO)只是为了再次将它再次序列化 - 这显然不是最理想的。

那么,有没有办法漂亮地打印xml.etree.ElementTree

2 个答案:

答案 0 :(得分:1)

正如the docs所述,在write方法中:

  

file 是一个文件名,或者是为写入而打开的文件对象。

这包括StringIO个对象。所以:

outfile = cStringIO.StringIO()
tree.write(of)

然后你可以使用你最喜欢的方法 - outfile漂亮地打印outfile.seek(0),然后将outfile本身传递给一个接收文件的函数,或者将outfile.getvalue()传递给lxml.etree一个带字符串的函数。

然而,请注意,在您链接的问题中打印XML的许多方法甚至都不需要这样。例如:

  • lxml.etree.tostring (answer #2)ElementTree是stdlib etree的近乎完美的超集,因此,如果您要将其用于漂亮打印,只需使用它来构建XML第一名。
  • Effbot indent/prettyprint (answer #3):这需要一个BEGIN INSERT INTO Przedmioty_Studentów SELECT Id_Studenta, Id_Przedmiotu FROM Obowiązkowe_Przedmioty_Studentów ops JOIN inserted i ON ops.Id_Studenta = i.Id_Studenta; END; 树,这正是您已经拥有的树,而不是字符串或文件。

答案 1 :(得分:0)

我在使用漂亮的打印纸时遇到问题。深入研究它,发现以下对我有用的解决方案。

import xml.etree.cElementTree as etree
from xml.dom import minidom

root = etree.Element("root")
animal = etree.SubElement(root, "animal")
etree.SubElement(animal, "pet").text = "dog"

xmlstr = 
minidom.parseString(etree.toString(root)).toprettyxml(indent = "   ")
print (xmlstr)

以XML格式返回结果