Python - 打印漂亮的XML为空标签文本创建开始和结束标签

时间:2013-05-29 12:30:25

标签: python xml-parsing elementtree

我正在编写一个python应用程序,它使用minidom的toprettyxml()创建一个ElementTree(XML),然后将其写入文件;

final_tree = minidom.parseString(ET.tostring(root))
fdout.write(final_tree.toprettyxml(indent = '    ')

问题是,我没有附加任何文字的标签只出现一个标签,例如:

<sometag/>

我希望它是:

<sometag>
</sometag>

我想在不解析整个字符串的情况下(没有正则表达式)。 有人熟悉这种方式吗? 感谢。

1 个答案:

答案 0 :(得分:3)

minidom.py中的行为是硬连线的(请查看writexml()中的class Element方法)。它并不意味着要改变,但对于当前实现,你可以像这样对它进行修补:

from xml.dom import minidom

t = minidom.parseString('<a><b></b></a>')

def patcher(method):
  def patching(self, *args, **kwargs):
    old = self.childNodes
    try:
      if not self.childNodes:
        class Dummy(list):
          def __nonzero__(self):  # Python2
            return True
          def __bool__(self):  # Python3
            return True
        old, self.childNodes = self.childNodes, Dummy([])
      return method(self, *args, **kwargs)
    finally:
      self.childNodes = old
  return patching

t.firstChild.__class__.writexml = patcher(t.firstChild.__class__.writexml)

print t.toprettyxml()

但我当然不能推荐这样的黑客。