使用toprettyxml()时新行的问题

时间:2009-11-02 16:40:24

标签: python xml

我目前正在python脚本中使用xml.dom模块的toprettyxml()函数,并且我对换行有一些麻烦。 如果不使用newl参数或者如果我使用toprettyxml(newl ='\ n'),它实际上会显示几行而不是一行。

例如

f = open(filename, 'w')
f.write(dom1.toprettyxml(encoding='UTF-8'))
f.close()

显示:

<params>


    <param name="Level" value="#LEVEL#"/>


    <param name="Code" value="281"/>


</params>

有谁知道问题的来源以及如何使用它? 仅供参考我使用的是Python 2.6.1

7 个答案:

答案 0 :(得分:10)

toprettyxml()非常糟糕。这不是Windows和'\ r \ n'的问题。尝试将任何字符串作为newl参数表示添加了太多行。不仅如此,还添加了其他空白(当机器读取xml时可能会导致问题)。

有些解决方法可用于 http://ronrothman.com/public/leftbraned/xml-dom-minidom-toprettyxml-and-silly-whitespace

答案 1 :(得分:5)

toprettyxml(newl='')适用于Windows。

答案 2 :(得分:5)

我找到了另一个很好的解决方案:

f = open(filename, 'w')
dom_string = dom1.toprettyxml(encoding='UTF-8')
dom_string = os.linesep.join([s for s in dom_string.splitlines() if s.strip()])
f.write(dom_string)
f.close()

上面的解决方案基本上删除了由toprettyxml()生成的dom_string中不需要的换行符。

取自 - &gt;的输入What's a quick one-liner to remove empty lines from a python string?

答案 3 :(得分:2)

如果您不介意安装新包,请尝试beautifulsoup。我对其xml prettyfier有很好的体验。

答案 4 :(得分:1)

这是一个非常古老的问题,但我想我知道问题是什么:

Minidoms pretty print有一个非常简单的方法。它只是添加您指定为参数的字符。这意味着,如果字符已经存在,它将复制字符。

E.g。如果你解析一个如下所示的XML文件:

<parent>
   <child>
      Some text
   </child>
</parent>

dom中已经有换行符和缩进词。这些被minidom视为文本节点,并且在将它解析为dom对象时仍然存在。

如果您现在继续将dom对象转换为XML字符串,那些文本节点仍将存在。意味着新行字符和缩进标签仍然存在。现在使用漂亮的打印,只需添加更多新行和更多标签。这就是为什么在这种情况下根本不使用漂亮的打印或指定newl=''将导致所需的输出。

但是,您在脚本中生成dom,文本节点将不在那里,因此使用newl='\r\n'和/或addindent='\t'进行精美打印会非常漂亮。

TL; DR缩进和换行仍然从解析和漂亮打印只是添加更多

答案 5 :(得分:0)

这在Python 3.6上为我提供了不错的XML,但在Windows上没有尝试过:

dom = xml.dom.minidom.parseString(xml_string)

pretty_xml_as_string = dom.toprettyxml(newl='').replace("\n\n", "\n")

答案 6 :(得分:-1)

您是否在Windows上查看生成的文件?如果是,请尝试使用toprettyxml(newl='\r\n')