Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中通过xml.etree.ElementTree生成的xml文件中插入换行符_Python_Xml - Fatal编程技术网

在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中默认情况下似乎没

我使用python中的xml.etree.ElementTree创建了一个xml文件。然后我使用

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>