【问题标题】:Python - print pretty XML create opening and closing tags for empty tags textPython - 打印漂亮的 XML 为空标签文本创建开始和结束标签
【发布时间】:2013-05-24 17:11:32
【问题描述】:

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

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

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

<sometag/>

我希望它是:

<sometag>
</sometag>

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

【问题讨论】:

  • 为什么会出现这样的问题?
  • 因为它应该看起来像第二种方式。
  • 第二个标签之间有换行符。不等于空。
  • 是的,但是为什么呢?任何 xml 解析器都不应该对第一种形式有问题。另一方面,第二个完全等同于第一个,因为它包含空格。如果有的话,那么相当于&lt;sometag/&gt;&lt;sometag&gt;&lt;/sometag&gt;(之间没有任何空格)。
  • 我明白,这是一个要求。

标签: python xml-parsing elementtree


【解决方案1】:

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

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()

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

【讨论】:

  • 非常感谢,我最终使用了正则表达式。
  • 谢谢@Alfe。我在学习 nand2tetris 课程时使用了你的技巧,你必须准确匹配 XML 答案键。我想我可以很好地打印出那个 XML,但我喜欢不理会答案键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多