如何在保留换行符的同时整理一些XML?

时间:2012-07-13 23:25:27

标签: xml newline tidy

我正在使用一些XML文件作为团队的一部分。由于某些人有不同的缩进设置,格式有时会搞砸,并且让自动化工具重新打印文件很方便。有没有办法漂亮地打印XML,而不删除空行中的所有换行符?这些是我正在使用的人类可读/编辑的XML文件(Ant脚本,配置文件,类似XHTML的专有内容等)。这些文件中的换行符是将文本/代码流分解为块,对于使文件易于阅读非常重要。

我正在使用EditPadPro作为我的文本编辑器(它可以使用外部工具)和HTML Tidy作为我的XML格式化程序,但我不喜欢它删除换行符。我可以使用什么工具来正确格式化/漂亮打印XML,而不删除换行符?

恼人的XML示例:

<thing>
  <frob>
    </frob>

  <!-- Done frobbing; now for BAZ. -->
        <baz />
</thing>

首选输出:

<thing>
  <frob>
  </frob>

  <!-- Done frobbing; now for BAZ. -->
  <baz />
</thing>

2 个答案:

答案 0 :(得分:1)

Eclipse当您选择all和reindent(Ctrl + A,Ctrl + I)时,XML编辑器就会这样做。 这有点矫枉过正,因为Eclipse是一个完整的IDE,而不是一个轻量级的文本编辑器,但是如果你绝望的是它的解决方案。

请注意,使用XML编辑器重新定义会执行其他操作,例如,如果默认情况下长度超过80个字符,则会拆分多行上的元素,这当然可以调整或禁用。

答案 1 :(得分:1)

您可以使用XML解析器对其进行解析并再次转储它。这是Python中的代码:

from xml.parsers.expat import ParserCreate

class process:
    def __init__(self):
        self.level = 0
    def start_element(self, name, attrs):
        attr = ''
        for i, j in attrs.iteritems():
            attr += ' {0}="{1}"'.format(i, j)
        print '{0}<{1}{2}>'.format('  '*self.level, name, attr)
        self.level += 1
    def end_element(self, name):
        self.level -= 1
        print '{0}</{1}>'.format('  '*self.level, name)
    def char_data(self, data):
        data = data.strip()
        if data:
            print '  '*self.level+data

if __name__ == '__main__':
    import sys
    for f in sys.argv[1:]:
        p = ParserCreate()
        q = process()
        p.StartElementHandler = q.start_element
        p.EndElementHandler = q.end_element
        p.CharacterDataHandler = q.char_data
        p.ParseFile(open(f))

将其另存为xml_prettifier.py并运行python xml_prettifier.py <file>.xml