我必须创建一个.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_declarationtostring()参数,因此您可以同时获得这两个参数。而且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")打开的文件中,而无需进一步编码。)

09-10 22:03
查看更多