inserting newlines in xml file generated via xml.etree.ElementTree in python
我已经在python中使用xml.etree.ElementTree创建了一个xml文件。 然后我用
1 | tree.write(filename,"UTF-8") |
将文档写到文件中。
但是,当我使用文本编辑器(在Linux上为vi)打开文件名时,标记之间没有换行符。 一切都是一条大线
我如何以"漂亮打印"格式写出文档,以便所有xml标记之间都有新行(以及希望的缩进等)?
谢谢!
我找到了一种避免新库并重新解析xml的新方法。
您只需要将root元素传递给此函数(请参见以下说明):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def indent(elem, level=0): i =" " + 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"的属性。
此属性可以在节点后设置字符串:
1 | "texttail" |
我从2004年开始找到一个链接,该链接介绍了使用此"尾部"缩进元素的元素库函数。
例:
1 2 3 4 5 6 | 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"的结果:
1 2 3 4 5 | <?xml version='1.0' encoding='utf-8'?> <fruits> <fruit>banana</fruit> <fruit>apple</fruit> </fruits> |
我认为最简单的解决方案是切换到lxml库。在大多数情况下,您只需将导入从
然后可以在序列化时使用
1 | tree.write(filename, pretty_print=True) |
(也可以在
ElementTree中没有漂亮的打印支持,但是您可以利用其他XML模块。
例如,
Node.toprettyxml([indent=""[, newl=""[, encoding=""]]]) Return a pretty-printed version of the document. indent specifies the indentation string and defaults to a tabulator; newl specifies the string emitted at the end of each line and defaults to
.
使用
一个使用默认格式字符的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | >>> 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> >>> |
无需使用外部库,通过将每个元素的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',其中选项卡数指示输出中显示的选项卡数。
根据该线程,最好的选择是安装
1 2 3 4 5 6 7 8 9 10 11 12 | 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() |