Jak ładnie wydrukować XML z wiersza poleceń?

Related: Jak mogę wydrukować JSON w skrypcie powłoki (unix)?

Czy istnieje skrypt powłoki (unix) formatujący XML w formie czytelnej dla człowieka?

W zasadzie chcę, aby przekształciła się ona w:

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

... w coś takiego:

<root>
    <foo a="b">lorem</foo>
    <bar value="ipsum" />
</root>
Author: Community, 2013-04-18

5 answers

Spróbuj to zrobić:

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

To narzędzie pochodzi z libxml2-utils

Lub

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

To polecenie pochodzi z XML:: Gałązka perl moduł, czasami xml-twig-tools pakiet.

Lub

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

To polecenie pochodzi z xmlstarlet

Lub

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

Sprawdź tidy pakiet

Lub

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

Lub

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

Sprawdź saxon-lint

Lub

 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'

Sprawdź saxon-HE

 699
Author: Gilles Quenot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-24 22:48:48

xmllint --format yourxmlfile.xml

Xmllint jest narzędziem XML wiersza poleceń i znajduje się w libxml2 (http://xmlsoft.org/).

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

Uwaga: Jeśli nie masz zainstalowanego libxml2, możesz go zainstalować wykonując następujące czynności:

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

MacOS

Aby zainstalować to na MacOS z Homebrew wystarczy zrobić: brew install libxml2

 107
Author: crmpicco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 06:00:45

Możesz również użyć tidy , które mogą być najpierw zainstalowane (np. na Ubuntu: sudo apt-get install tidy).

W tym celu wydasz coś w stylu:

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

Uwaga: ma wiele dodatkowych znaczników czytelności, ale zachowanie zawijania wyrazów jest nieco irytujące do rozplątania ( http://tidy.sourceforge.net/docs/quickref.html).

 31
Author: matanster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-12 16:50:21

Nie wspomniałeś o pliku, więc zakładam, że chcesz podać łańcuch XML jako standardowe wejście w wierszu poleceń. W takim przypadku wykonaj następujące czynności:

$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -
 10
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 19:09:58

Xmllint obsługuje formatowanie in-place :

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

Jak napisał Daniel Veillard:

Myślę xmllint -o tst.xml --format tst.xml powinno być bezpieczne, ponieważ parser w pełni załaduje dane wejściowe do drzewa przed otwarciem wyjścia w celu serializacji go.

Poziom wcięcia jest kontrolowany przez zmienną środowiskową XMLLINT_INDENT, która domyślnie zawiera 2 spacje. Przykład jak zmienić wcięcie na 4 spacje:

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

Możesz mieć brak z opcją --recover gdy dokumenty XML są złamana. Lub spróbuj słabego parsera HTML ze ścisłym wyjściem XML:

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

--nsclean, --nonet, --nocdata, --noblanks etc mogą być przydatne. Przeczytaj stronę podręcznika.

apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2
 3
Author: gavenkoa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-27 08:17:35