Есть ли программа с интерфейсом командной строки (Linux) для форматирования XML в удобочитаемую форму?
По сути, я хочу, чтобы он изменил следующее:
<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
… в примерно такой вид:
<root> <foo a="b">lorem</foo> <bar value="ipsum" /> </root>
Вариантов отформатировать XML в командной строке много. Рассмотрим некоторые из них.
xmllint
Можно передать XML в стандартный ввод команды xmllint. Эта утилита включена в пакет libxml2-utils (утилиты и библиотека для обработки XML) в Debian и в пакет с именем libxml2 в Arch Linux.
Пример команды:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -
XML::Twig на Perl
Эта команда поставляется с модулем PERL XML::Twig (модуль для простой обработки XML), в стандартных репозиториях этот пакет называется xml-twig-tools в Debian и производных, а в Arch Linux и производных пакет называется perl-xml-twig.
Пример запуска:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xml_pp
xmlstarlet
Эта команда поставляется с xmlstarlet — набором инструментов для преобразования, запроса, проверки и редактирования XML-документов.
Пример использования:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmlstarlet format --indent-tab
tidy
Tidy исправляет и очищает документы HTML и XML, исправляя ошибки разметки и обновляя устаревший код до современных стандартов.
Пример запуска:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | tidy -xml -i -
Обратите внимание, что tidy также может форматировать xml без корневого элемента. Это полезно для форматирования при передаче через конвейер (в стандартный ввод), секций xml (например, извлечённых из логов).
echo '<x></x><y></y>' | tidy -xml -iq
Опции, которые могут быть полезными для вас:
tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml
Python
xml.dom.minidom из Python может форматировать XML (как python2, так и python3):
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print(xml.dom.minidom.parseString(s).toprettyxml())'
Связанные статьи:
- Примеры команды Sed (50%)
- Уроки по Awk (50%)
- Как отфильтровать текст, находящийся между двумя определёнными строками (50%)
- Как добавить строку в начало или в конец каждой строчки (50%)
- Как сделать замену от совпадения до конца строки (50%)
- Как вывести от определённого столбца до последнего в командной строке Linux (RANDOM - 50%)