2013-04-18 4 views
349

Относящиеся: How can I pretty-print JSON in (unix) shell script?Как довольно печатать XML из командной строки?

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

В принципе, я хочу, чтобы преобразовать следующим образом:

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

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

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

ответ

611

Попробуйте сделать это:

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

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

или

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

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

или

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

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

или

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

проверка tidy пакета

или

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

или

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

проверка saxon-lint

или

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' 

Проверить saxon-HE

+0

Хорошо, быстрый ответ. Первый вариант кажется, что он будет более вездесущим в современных установках * nix. Небольшая точка; но можно ли это назвать без работы через промежуточный файл? I.e., 'echo '' | xmllint - some-read-from-stdn-option'? – svidgen

+0

Посмотреть мой отредактированный пост –

+0

Пакет 'libxml2-utils' в моей прекрасной ubuntu. – franzlorenzon

9

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

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

Чтобы xmllint доступны на системах Debian, вам необходимо установить пакет libxml2-utils (libxml2 не предоставляет этот инструмент, по крайней мере не на Debian 5.0 «Lenny» и 6,0 " Сожмите ").

95

xmllint --format yourxmlfile.xml

xmllint является инструментом XML командной строки и включен в libxml2 (http://xmlsoft.org/).

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

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

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

MacOS

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

+4

ответ sputnick содержит эту информацию, но ответ crmpicco является наиболее полезным ответом здесь на общий вопрос о том, как красиво печатать XML. –

+2

, мы можем записать, что форматированный XML-вывод в какой-то другой XML-файл и использовать его. Например, xmllint --format yourxmlfile.xml >> new-file.xml – LearnToLive

+2

На Ubuntu 16.04 вы можете использовать следующее: 'sudo apt-get install libxml2-utils' – Melle

27

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

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

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

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

+0

Полезно, потому что я не мог заставить xmllint добавлять строки в однострочный XML-файл. Благодаря! – xlttj

+0

'tidy' хорошо работает и для меня. В отличие от 'hxnormalize', это действительно закрывает тег' '. –

+6

BTW, вот некоторые варианты, которые я нашел полезными: 'tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml> OutFile.xml'. –

Смежные вопросы