Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用toprettyxml()时换行出现问题_Python_Xml - Fatal编程技术网

Python 使用toprettyxml()时换行出现问题

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="

我目前正在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

您是否在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,并且不允许安装任何第三方附加软件包

实施的关键如下:

  • 使用dom.toprettyxml()
  • 删除所有空白
  • 根据您的要求添加新行和选项卡
  • ~

    导入操作系统
    进口稀土
    导入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")