在python中通过xml.etree.ElementTree生成的xml文件中插入换行符
我使用python中的xml.etree.ElementTree创建了一个xml文件。然后我使用在python中通过xml.etree.ElementTree生成的xml文件中插入换行符,python,xml,Python,Xml,我使用python中的xml.etree.ElementTree创建了一个xml文件。然后我使用 tree.write(filename, "UTF-8") 将文档写入文件 但是,当我使用文本编辑器打开filename时,标记之间没有换行符。一切都是一条大线 如何以“漂亮打印”的格式写出文档,以便在所有xml标记之间都有新行(最好是缩进等)?您最好的选择是安装pyXml,并将其用于prettyprintxml内容(由于ElementTree在Python中默认情况下似乎没
tree.write(filename, "UTF-8")
将文档写入文件
但是,当我使用文本编辑器打开filename时,标记之间没有换行符。一切都是一条大线
如何以“漂亮打印”的格式写出文档,以便在所有xml标记之间都有新行(最好是缩进等)?您最好的选择是安装pyXml
,并将其用于prettyprint
xml内容(由于ElementTree在Python中默认情况下似乎没有prettyprinter):
ElementTree中没有漂亮的打印支持,但您可以利用其他XML模块 例如:
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>
>>>
>>从xml.dom导入minidom
>>>从xml.etree导入元素树
>>>tree1=ElementTree.XML('12')
>>>ElementTree.tostring(树1)
'12'
>>>打印minidom.parseString(ElementTree.tostring(tree1)).toprettyxml()
1.
2.
>>>
我认为最简单的解决方案是切换到库。在大多数情况下,您只需将导入从导入xml.etree.ElementTree as etree
更改为从lxml导入etree
或类似
然后,您可以在序列化时使用pretty\u print
选项:
tree.write(filename, pretty_print=True)
(也可以在
etree.tostring
上找到)我找到了一种新方法来避免新库和重新分析xml。
您只需将根元素传递给此函数(请参见下面的说明):
xml.etree.ElementTree.Element实例上有一个名为“”的属性。
此属性可以在节点后设置字符串:
"<a>text</a>tail"
使用此“尾部”缩进元素的
例如:
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)
root=ET.fromstring(“bananaapple”)
tree=ET.ElementTree(根)
缩进(根)
#编写xml
write(“example.xml”,encoding=“utf-8”,xml\u声明=True)
“example.xml”的结果:
香蕉
苹果
无需使用外部库,您可以通过将每个元素的tail属性设置为'\n'
轻松实现输出中每个XML标记之间的换行
您还可以在此处指定换行符后的选项卡数量。但是,在OP的用例中,使用外部库可以更容易地实现选项卡,或者参见Erick M.Sprengel的答案
在python中使用xml.etree.ElementTree修改xml文档时,我遇到了同样的问题。在我的例子中,我解析xml文件,清除某些元素(使用Element.clear()),然后将结果写回文件
对于我清除的每个元素,在输出文件中的标记后面没有新行
ElementTree的Element.clear()文档说明:
此函数用于删除所有子元素,清除所有属性,并将文本和尾部属性设置为“无”
这使我意识到,元素的文本和尾部属性是如何确定输出格式的。在我的例子中,我可以将已清除元素的这些属性设置为与清除它之前相同的值。对于根xml元素的第一级子元素,此尾部值为
'\n\t'
,带有制表符的数量,表示输出中显示的制表符的数量。回答得好,但唯一的问题是:为什么minidom会插入额外的空格(对于1
和2
;在xml中很重要)?好的问题;-)小心使用.Thnaks作为answear!它几乎为我所用。唯一的问题是,当我执行ET.tostring(main,encoding='utf8',method='xml').decode()时,它从标题中删除了encoding=“utf-8”
。用toprettyxml(encoding='utf8')解决了这个问题
谢谢Steven。这就是我最后要做的。但这对添加到树中的新创建元素不起作用。它们看起来仍然很笨拙。在这里找到了答案。pretty\u print
选项做了什么?上面说它“启用格式化的XML,“但是XML被格式化意味着什么呢?他放弃了一个很好的解决方案——如果有什么安慰的话,我正在使用你的代码,而且效果很好!我也喜欢你的解决方案。我只需将函数中的第一行更改为不使用“/n”,而是使用os.linesep
就可以在记事本(Windows)中正确地获得新行。这确实是一个很好的解决方案!事实上,在lxml
中将新子元素附加到节点时,新元素没有设置尾部空白。因此,在这种情况下,即使使用lxml
软件包,您的解决方案也是必要的。惊人的解决方案!希望它能建在图书馆里。这太棒了。正是我需要的。非常感谢。
"<a>text</a>tail"
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)
<?xml version='1.0' encoding='utf-8'?>
<fruits>
<fruit>banana</fruit>
<fruit>apple</fruit>
</fruits>