669 votes

Comment imprimer joliment le XML à partir de la ligne de commande ?

En rapport : Comment puis-je imprimer JSON dans un shell (unix) script ?

Existe-t-il un shell (unix) script pour formater le XML en format lisible par l'homme ?

En gros, je veux qu'il transforme ce qui suit :

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

... en quelque chose comme ça :

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

1 votes

Pour avoir xmllint disponible sur les systèmes Debian, vous devez installer le paquet libxml2-utils ( libxml2 ne fournit pas cet outil, du moins pas sur Debian 5.0 "Lenny" et 6.0 "Squeeze").

1144voto

sputnick Points 31663

xmllint

Cet utilitaire est livré avec libxml2-utils :

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

Le langage Perl XML::Twig

Cette commande est accompagnée de XML::Twig perl module, parfois xml-twig-tools paquet :

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

xmlstarlet

Cette commande est accompagnée de xmlstarlet :

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

tidy

Vérifiez le tidy paquet :

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

Python

Python xml.dom.minidom peut formater le XML (fonctionne également sur l'ancien python2) :

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

Vous devez saxon-lint :

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

saxon-HE

Vous devez 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'

0 votes

Bonne réponse, rapide. La première option semble être plus omniprésente sur les installations *nix modernes. Un point mineur ; mais peut-on l'appeler sans passer par un fichier intermédiaire ? C'est-à-dire, echo '<xml .. />' | xmllint --some-read-from-stdn-option ?

0 votes

Le paquet est libxml2-utils dans mon magnifique ubuntu.

0 votes

Savez-vous comment emballer de longues lignes ?

189voto

crmpicco Points 2226

xmllint --format yourxmlfile.xml

xmllint est un outil XML en ligne de commande et est inclus dans le module libxml2 ( http://xmlsoft.org/ ).

\================================================

Remarque : Si vous n'avez pas libxml2 vous pouvez l'installer en procédant comme suit :

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

Pour l'installer sur MacOS avec Homebrew, il suffit de faire : brew install libxml2

Git

Egalement disponible sur Git si vous voulez le code : git clone git://git.gnome.org/libxml2

4 votes

La réponse de sputnick contient ces informations, mais la réponse de crmpicco est la réponse la plus utile ici à la question générale sur la façon d'imprimer joliment du XML.

4 votes

Nous pouvons écrire cette sortie xml formatée dans un autre fichier xml et l'utiliser par exemple xmllint --format yourxmlfile.xml >> new-file.xml

2 votes

Sur Ubuntu 16.04, vous pouvez utiliser ce qui suit : sudo apt-get install libxml2-utils

45voto

matt Points 946

Vous pouvez également utiliser rangé qui peut nécessiter une installation préalable (par exemple, sur Ubuntu : sudo apt-get install tidy ).

Pour cela, vous devez émettre un message du type suivant :

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

Note : possède de nombreux indicateurs de lisibilité supplémentaires, mais le comportement de retournement des mots est un peu ennuyeux à démêler ( http://tidy.sourceforge.net/docs/quickref.html ).

1 votes

Utile, car je n'arrivais pas à faire en sorte que xmllint ajoute des sauts de ligne à un fichier xml d'une seule ligne. Merci !

0 votes

tidy fonctionne bien pour moi aussi. Contrairement à hxnormalize ce qui a pour effet de fermer l <body> étiquette.

12 votes

BTW, voici quelques options que j'ai trouvées utiles : tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml .

14voto

David Points 2580

Vous n'avez pas mentionné de fichier, je suppose donc que vous voulez fournir la chaîne XML comme entrée standard sur la ligne de commande. Dans ce cas, faites ce qui suit :

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

9voto

twonkeys Points 96

Pour avoir xmllint disponible sur les systèmes Debian, vous devez installer le paquet libxml2-utils ( libxml2 ne fournit pas cet outil, du moins pas sur Debian 5.0 "Lenny" et 6.0 "Squeeze").

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X