我必须创建一个.xml文件,它有漂亮的打印和编码声明。应该是这样的:像这样:
<?xml version='1.0' encoding='utf-8'?>
<main>
<sub>
<name>Ana</name>
<detail />
<type>smart</type>
</sub>
</main>
我知道如何得到漂亮的印刷品和申报单,但不是同时。
要获得utf-8声明,但没有漂亮的打印,我使用以下代码:
f = open(xmlPath, "w")
et.write(f, encoding='utf-8', xml_declaration=True)
f.close()
但是如果我想得到漂亮的打印结果,我必须将xml树转换为字符串,并且我将丢失声明。我使用这个代码:
from xml.dom import minidom
xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ")
with open(xmlPath, "w") as f:
f.write(xmlstr.encode('utf-8'))
f.close()
最后一段代码,我得到了一个漂亮的结果,只有第一行是:
<?xml version="1.0" ?>
我还是把这个换成
<?xml version='1.0' encoding='utf-8'?>
但我不认为这是最蟒蛇的方法。
我使用xml模块,我不喜欢安装额外的模块,因为脚本必须使用标准python从不同的计算机上运行。但如果不可能,我会安装其他模块。
后期编辑:
最后,在伦兹的帮助下,我用这个:
#ET=lxml.etree
xmlPath=os.path.join(output_folderXML ,"test.xml")
xmlstr= ET.tostring(root, encoding='UTF-8', xml_declaration=True, pretty_print=True)
with open(xmlPath, "w") as f:
f.write(xmlstr)
f.close()
我需要知道以“w”模式而不是“wb”模式将“toString”方法的结果写入.xml文件是否安全。
正如我在下面的一条评论中所说,使用“wb”在记事本中打开xml文件时,我没有得到漂亮的打印效果,但使用“w”时,我得到了。
另外,我还检查了以“w”模式编写的xml文件,其中有“ü”等特殊字符。
我只需要一个称职的意见,我所做的技术上是可以的。
最佳答案
最优雅的解决方案当然是使用第三方库lxml,因为有充分的理由,第三方库正被大量使用。
它在pretty_print
方法中同时提供xml_declaration
和tostring()
参数,因此您可以同时获得这两个参数。而且api与std lib elementtree非常接近,您现在似乎正在使用它。下面是一个例子:
>>> from lxml import etree
>>> doc = etree.parse(xmlPath)
>>> print etree.tostring(doc, encoding='UTF-8', xml_declaration=True,
pretty_print=True)
<?xml version='1.0' encoding='UTF-8'?>
<main>
<sub>
<name>Ana</name>
<detail/>
<type>smart</type>
</sub>
</main>
但是,我理解您只想使用“附带电池”。
据我所见,
xml.etree.ElementTree
无法自动更改缩进。但是
minidom
的解决方案是同时获得漂亮的打印和完整的声明:使用encoding
方法的toprettyxml()
参数!>>> doc = minidom.parseString(ET.tostring(root))
>>> print doc.toprettyxml(encoding='utf8')
<?xml version="1.0" encoding="utf8"?>
<main>
<sub>
<name>Ana</name>
<detail/>
<type>smart</type>
</sub>
</main>
(请注意,返回的字符串已经编码,您应该将其写入以二进制模式(
"wb"
)打开的文件中,而无需进一步编码。)