web-dev-qa-db-fra.com

Comment bien imprimer XML depuis la ligne de commande?

Connexes: Comment puis-je imprimer JSON en script shell (unix)?

Existe-t-il un script shell (unix) permettant de formater XML sous une forme lisible par l'homme?

En gros, je veux que cela transforme ce qui suit:

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

... dans quelque chose comme ça:

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

libxml2-utils

Cet utilitaire est livré avec libxml2-utils :

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

Perl _XML::Twig_

Cette commande est fournie avec le module XML :: TwigPerl , parfois _xml-twig-tools_:

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

xmlstarlet

Cette commande est livrée avec xmlstarlet :

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

tidy

Vérifiez le package tidy:

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

Python

_xml.dom.minidom_ de Python peut formater XML (python2 et 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

Vous avez besoin de saxon-lint :

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

saxon-HE

Vous avez besoin de 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'
_
826
Gilles Quenot

xmllint --format yourxmlfile.xml

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

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

Remarque: Si vous n'avez pas installé 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

138
crmpicco

Vous pouvez également utiliser tidy , qui devra peut-être d'abord être installé (par exemple sur Ubuntu: Sudo apt-get install tidy).

Pour cela, vous émettriez quelque chose comme:

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

Remarque: comporte de nombreux indicateurs de lisibilité supplémentaires, mais le comportement Word-wrap est un peu gênant à démêler ( http://tidy.sourceforge.net/docs/quickref.html ).

35
matanster

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

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

xmllint prend en charge le formatage sur place :

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

Comme Daniel Veillard l'a écrit:

Je pense que xmllint -o tst.xml --format tst.xml devrait être sûr car l'analyseur chargera complètement l'entrée dans un arbre avant d'ouvrir la sortie pour la sérialiser.

Le niveau d’indentation est contrôlé par la variable d’environnement XMLLINT_INDENT qui est par défaut de 2 espaces. Exemple de modification du retrait par 4 espaces:

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

Il se peut que vous manquiez de l'option --recover lorsque vos documents XML sont rompus. Ou essayez un analyseur HTML faible avec une sortie XML stricte:

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

--nsclean, --nonet, --nocdata, --noblanks etc peut être utile. Lisez la page de manuel.

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

Sans rien installer sur mac

Utilisez tidy

cat filename.xml | tidy -xml -iq

La redirection de la visualisation d'un fichier avec cat pour mettre de l'ordre en spécifiant le type de fichier xml et pour mettre en retrait tout en mode silencieux supprimera la sortie d'erreur. JSON fonctionne également avec -json.

3
jasonleonhard