it-swarm.com.ru

Как красиво распечатать XML из командной строки?

Связанный: Как я могу красиво напечатать JSON в (unix) сценарии оболочки?

Существует ли (unix) сценарий оболочки для форматирования XML в удобочитаемой форме?

По сути, я хочу преобразовать следующее:

<root><foo a="b">lorem</foo><bar value="ipsum" /></root>

... в нечто вроде этого:

<root>
    <foo a="b">lorem</foo>
    <bar value="ipsum" />
</root>
458
svidgen

libxml2-utils

Эта утилита поставляется с libxml2-utils :

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmllint --format -

Perl XML::Twig

Эта команда поставляется с модулем XML :: TwigPerl , иногда пакетом xml-twig-tools:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xml_pp

xmlstarlet

Эта команда поставляется с xmlstarlet :

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmlstarlet format --indent-tab

tidy

Проверьте пакет tidy:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    tidy -xml -i -

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

saxon-lint

Вам нужно saxon-lint :

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    saxon-lint --indent --xpath '/' -

saxon-HE

Вам нужно saxon-HE :

 echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    Java -cp /usr/share/Java/saxon/saxon9he.jar net.sf.saxon.Query \
    -s:- -qs:/ '!indent=yes'
801
Gilles Quenot

xmllint --format yourxmlfile.xml

xmllint - это инструмент XML командной строки, который входит в libxml2 ( http://xmlsoft.org/ ).

================================================

Примечание. Если у вас не установлен libxml2, вы можете установить его, выполнив следующие действия:

CentOS

cd /tmp
wget ftp://xmlsoft.org/libxml2/libxml2-2.8.0.tar.gz
tar xzf libxml2-2.8.0.tar.gz
cd libxml2-2.8.0/
./configure
make
Sudo make install
cd

Ubuntu

Sudo apt-get install libxml2-utils

Cygwin

apt-cyg install libxml2

MacOS

Чтобы установить это на MacOS с Homebrew, просто сделайте: brew install libxml2

Git

Также доступно в Git, если вы хотите код: git clone git://git.gnome.org/libxml2

133
crmpicco

Вы также можете использовать tidy , который может потребоваться сначала установить (например, в Ubuntu: Sudo apt-get install tidy).

Для этого вы должны выполнить что-то вроде следующего:

tidy -xml -i your-file.xml > output.xml

Примечание: имеет много дополнительных флагов читабельности, но поведение Word-wrap немного раздражает ( http://tidy.sourceforge.net/docs/quickref.html ).

34
matanster

Вы не упомянули файл, поэтому я предполагаю, что вы хотите предоставить строку XML в качестве стандартного ввода в командной строке. В этом случае сделайте следующее:

$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -
12
David

xmllint поддерживает форматирование на месте :

for f in *.xml; do xmllint -o $f --format $f; done

Как писал Даниэль Вейяр:

Я думаю, что xmllint -o tst.xml --format tst.xml должен быть безопасным, так как синтаксический анализатор полностью загрузит входные данные в дерево перед открытием выходных данных для его сериализации.

Уровень отступа контролируется переменной среды XMLLINT_INDENT, которая по умолчанию имеет 2 пробела. Пример, как изменить отступ на 4 пробела:

XMLLINT_INDENT='    '  xmllint -o out.xml --format in.xml

Возможно, вам не хватает опции --recover, когда ваши XML-документы повреждены. Или попробуйте слабый анализатор HTML со строгим выводом XML:

xmllint --html --xmlout <in.xml >out.xml

--nsclean, --nonet, --nocdata, --noblanks и т. д. могут быть полезны. Прочитайте справочную страницу.

apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2
6
gavenkoa

Не устанавливая ничего на Mac

Используйте tidy

cat filename.xml | tidy -xml -iq

Перенаправление просмотра файла с помощью команды cat на tidy с указанием типа файла xml и на отступ при тихом выводе будет подавлять вывод ошибок. JSON также работает с -json.

1
jasonleonhard