我目前正在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
答案 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')
。