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 在执行读取xml文件、附加元素和写入文件时格式混乱_Python_Xml_Dom_Pretty Print - Fatal编程技术网

Python 在执行读取xml文件、附加元素和写入文件时格式混乱

Python 在执行读取xml文件、附加元素和写入文件时格式混乱,python,xml,dom,pretty-print,Python,Xml,Dom,Pretty Print,使用python、minidom 我正在读取一个格式非常好的xml文件,然后在将其重新写入文件之前添加元素 除了新添加元素的格式外,其他一切都可以正常工作 看起来, <previousTag> .. everything which was already in the xml file is correctly formatted. <addedTag1><addedTag2></addedTag2></addedTag1>

使用python、minidom

我正在读取一个格式非常好的xml文件,然后在将其重新写入文件之前添加元素

除了新添加元素的格式外,其他一切都可以正常工作

看起来,

<previousTag>
   .. everything which was already in the xml file is correctly formatted.
   <addedTag1><addedTag2></addedTag2></addedTag1></previousTag>

.. xml文件中已经存在的所有内容都已正确格式化。
而我想要

<previousTag>
  <addedTag1>
     <addedTag2>
     </addedTag2>
  </addedTag1>
</previousTag>

我尝试使用toprettyxml()将整个内容转换为prettyxml。 但是看起来

<previousTag>
  ..so many unwanted whitespaces inbetween already existing tags..
  <addedTag1>
      <addedTag2>
      </addedTag2>
  </addedTag1>
  ..whitespaces..
</previousTag>

…在已经存在的标记之间有太多不需要的空白。。
…空格。。

您需要自己去除空白,或者通知解析器为您这样做(如果可能的话)

我花了几分钟的时间尝试使用minidom查找可用的解析器配置选项查看了源代码,老实说,我不想再看下去了,因为它使用
lxml.etree有很好的文档记录:

from lxml import etree

sample = """
<previousTag>
  <previousSubElement1>Foo</previousSubElement1>
  <previousSubElement2>Bar</previousSubElement2>
</previousTag>
"""

doc = etree.XML(sample,etree.XMLParser(remove_blank_text=True))
addedTag1 = doc.makeelement('addedTag1')
addedTag2 = doc.makeelement('addedTag2')
addedTag2.text = "Baz"
addedTag1.append(addedTag2)
doc.append(addedTag1)

print etree.tostring(doc,pretty_print=True)
从lxml导入etree
样本=”“
福
酒吧
"""
doc=etree.XML(示例,etree.XMLParser(remove\u blank\u text=True))
addedTag1=doc.makeelement('addedTag1')
addedTag2=doc.makeelement('addedTag2')
addedTag2.text=“Baz”
addedTag1.append(addedTag2)
附加文件(已添加标签1)
打印etree.tostring(doc,pretty\u print=True)
屈服:

<previousTag>
  <previousSubElement1>Foo</previousSubElement1>
  <previousSubElement2>Foo</previousSubElement2>
  <addedTag1>
    <addedTag2>Baz</addedTag2>
  </addedTag1>
</previousTag>

福
福
巴兹

使用
lxml.etree
还有其他修改XML对象的方法,这只是一个快速而肮脏的示例。

这家伙有一个很好的方法来修复toprettyxml()的空白疯狂: