Python 使用toprettyxml()时换行出现问题
我目前正在Python脚本中使用Python 使用toprettyxml()时换行出现问题,python,xml,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="
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您是否在Windows上查看生成的文件?如果是这样,请尝试使用
toprettyxml(newl='\r\n')
如果您不介意安装新软件包,请尝试beautifulsoup。我在its方面有很好的经验。toprettyxml()
非常糟糕。这不是Windows和'\r\n'的问题。尝试任何字符串作为newl
参数表明添加的行太多。不仅如此,还添加了其他空格(当机器读取xml时可能会导致问题)
可在toprettyxml(newl='')
适用于我在Windows上使用。我找到了另一个很好的解决方案:
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_字符串中删除不需要的换行符
来自->的输入这是一个相当老的问题,但我想我知道问题是什么: Minidoms pretty print有一个非常直接的方法。它只添加指定为参数的字符。这意味着,如果字符已经存在,它将复制这些字符 例如,如果您解析一个如下所示的XML文件:
<parent>
<child>
Some text
</child>
</parent>
一些文本
dom中已经有换行符和缩进。minidom将这些节点作为文本节点,当您将其解析为dom对象时,它们仍然存在
如果现在继续将dom对象转换为XML字符串,那么这些文本节点仍将存在。这意味着新行字符和缩进制表符仍然存在。现在使用pretty print,只需添加更多新行和更多选项卡即可。这就是为什么在这种情况下,根本不使用pretty print或指定newl='
将产生所需的输出
但是,如果在脚本中生成dom,文本节点将不在那里,因此使用newl='\r\n'
和/或addendent='\t'
进行打印会非常漂亮
TL;DR缩进和换行仍然是解析的结果,而pretty print只是添加了更多的函数,下面的函数解决了我的问题。 我必须使用Python2.7,并且不允许安装任何第三方附加软件包 实施的关键如下:
导入操作系统
进口稀土
导入xml.dom.minidom
导入系统
类XmlTag:
开口=0
关闭=1
自动关闭=2
正在关闭标签=“”
打开_tag=“这在Python 3.6上提供了很好的XML,但在Windows上没有尝试过:
dom = xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = dom.toprettyxml(newl='').replace("\n\n", "\n")
非常感谢Xv!事实上,现在,我正试图尽可能少地使用toprettyxml(),但很高兴知道有一个解决这个恼人问题的方法。这篇文章对Ubuntu 16.04(bash)非常清晰tooThis适用于除第一行之外的每一行,它似乎剥离新行并合并第1行和第2行…对于python3,它需要dom\u string=b'\n'。join([s代表dom\u string.splitlines(),如果s.strip()])
这是我发现的唯一不需要第三方库的解决方案,干得好。
dom = xml.dom.minidom.parseString(xml_string)
pretty_xml_as_string = dom.toprettyxml(newl='').replace("\n\n", "\n")