我在python中使用xml.etree.ElementTree创建了一个xml文件。然后我用
tree.write(filename, "UTF-8")
将文档写入文件。
但是当我使用文本编辑器(linux上的vi)打开文件名时,标签之间没有换行符。一切都是一条大路
如何以“漂亮的印刷”格式写出文档,以便在所有xml标记之间有新的行(并且希望缩进等)?
谢谢!
答案 0 :(得分:49)
我发现了一种避免新库和重新分析xml的新方法。 你只需要将你的根元素传递给这个函数(见下面的解释):
def indent(elem, level=0):
i = "\n" + level*" "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
xml.etree.ElementTree.Element实例上有一个名为“tail”的属性。 此属性可以在节点之后设置字符串:
"<a>text</a>tail"
我发现了一个2004年的链接,告诉Element Library Functions使用这个“尾巴”来缩进元素。
示例:
root = ET.fromstring("<fruits><fruit>banana</fruit><fruit>apple</fruit></fruits>""")
tree = ET.ElementTree(root)
indent(root)
# writing xml
tree.write("example.xml", encoding="utf-8", xml_declaration=True)
结果“example.xml”:
<?xml version='1.0' encoding='utf-8'?>
<fruits>
<fruit>banana</fruit>
<fruit>apple</fruit>
</fruits>
答案 1 :(得分:19)
我认为最简单的解决方案是切换到lxml库。在大多数情况下,您只需将导入从import xml.etree.ElementTree as etree
更改为from lxml import etree
或类似。
然后,您可以在序列化时使用pretty_print
选项:
tree.write(filename, pretty_print=True)
(也可在etree.tostring
上找到)
答案 2 :(得分:12)
ElementTree中没有漂亮的打印支持,但您可以使用其他XML模块。
例如,xml.dom.minidom.Node.toprettyxml()
:
Node.toprettyxml([indent=""[, newl=""[, encoding=""]]])
返回文档的漂亮版本。 indent指定缩进字符串,默认为制表符; newl指定在每行末尾发出的字符串,默认为\ n。
使用indent
和newl
符合您的要求。
使用默认格式字符的示例:
>>> from xml.dom import minidom
>>> from xml.etree import ElementTree
>>> tree1=ElementTree.XML('<tips><tip>1</tip><tip>2</tip></tips>')
>>> ElementTree.tostring(tree1)
'<tips><tip>1</tip><tip>2</tip></tips>'
>>> print minidom.parseString(ElementTree.tostring(tree1)).toprettyxml()
<?xml version="1.0" ?>
<tips>
<tip>
1
</tip>
<tip>
2
</tip>
</tips>
>>>
答案 3 :(得分:0)
According to this thread您最好的选择是安装pyXml
并将其用于prettyprint
ElementTree
xml内容(因为ElementTree默认情况下似乎没有一个漂亮的打印机) Python)的:
import xml.etree.ElementTree as ET
from xml.dom.ext.reader import Sax2
from xml.dom.ext import PrettyPrint
from StringIO import StringIO
def prettyPrintET(etNode):
reader = Sax2.Reader()
docNode = reader.fromString(ET.tostring(etNode))
tmpStream = StringIO()
PrettyPrint(docNode, stream=tmpStream)
return tmpStream.getvalue()
答案 4 :(得分:0)
无需使用外部库,只需将每个元素的tail属性设置为'\ n',就可以轻松在输出中的每个XML标记之间实现换行。
您还可以在此处在换行符之后指定选项卡数。但是,在OP的用例选项卡中,使用外部库可能更容易实现选项卡,或者请参阅Erick M. Sprengel的答案。
在尝试使用python中的xml.etree.ElementTree修改xml文档时遇到了相同的问题。就我而言,我是在解析xml文件,清除某些元素(使用Element.clear()),然后将结果写回到文件中。
对于我清除的每个元素,其标记在输出文件中没有新行。
ElementTree的Element.clear()文档指出: “此功能将删除所有子元素,清除所有属性,并将text和tail属性设置为None。”
这使我意识到元素的text和tail属性是确定输出格式的方式。就我而言,我能够将清除元素的这些属性设置为与清除之前相同的值。对于根xml元素的第一级子代,该尾值最终为'\ n \ t',其中选项卡数指示输出中显示的选项卡数。