Как я могу привести в порядок некоторый XML, сохраняя новые строки?

Я работаю с некоторыми файлами 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>

person PotatoEngineer    schedule 13.07.2012    source источник


Ответы (2)


Вы можете использовать синтаксический анализатор 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.

person quantum    schedule 14.07.2012

XML-редактор Eclipse делает это, когда вы выбираете все и повторно отступаете (Ctrl+A, Ctrl+I). Это немного излишне, так как Eclipse — это полноценная IDE, а не легкий текстовый редактор, но если вы в отчаянии, это решение.

Обратите внимание, что повторные отступы с помощью редактора XML делают другие вещи, такие как разбиение элементов на несколько строк, если по умолчанию они длиннее 80 символов, это, конечно, можно настроить или отключить.

person jolivier    schedule 13.07.2012