格式化时执行读取xml文件,附加元素并写入文件

时间:2011-12-15 11:45:04

标签: python xml dom pretty-print

使用python,minidom ..

我正在阅读一个格式很好的xml文件,然后再添加元素,然后再将其写回文件。

除了新增元素的格式外,一切正常。

看起来像,

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

而我想要

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

我尝试使用toprettyxml()将整个事物转换为prettyxml。 但它看起来像

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

1 个答案:

答案 0 :(得分:0)

您需要自己剥离空白,或通知解析器为您执行此操作(如果可能)。

我花了几分钟时间尝试使用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)

产量:

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

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