En relation: Comment puis-je joliment imprimer JSON dans un script shell (unix)?
Existe-t-il un script shell (unix) pour formater XML sous une forme lisible par l'homme?
Fondamentalement, je veux qu'il transforme les éléments suivants:
<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>
xml
unix
command-line
svidgen
la source
la source
xmllint
disponible sur les systèmes Debian, vous devez installer le paquetlibxml2-utils
(libxml2
ne fournit pas cet outil, du moins pas sur Debian 5.0 "Lenny" et 6.0 "Squeeze").Réponses:
libxml2-utils
Cet utilitaire est livré avec
libxml2-utils
:Perl's
XML::Twig
Cette commande est livrée avec XML :: Twig perlmodule, parfois
xml-twig-tools
package:xmlstarlet
Cette commande est livrée avec
xmlstarlet
:tidy
Vérifiez le
tidy
package:Python
Python
xml.dom.minidom
peut formater XML (à la fois python2 et python3):saxon-lint
Vous avez besoin de
saxon-lint
:saxon-HE
Vous avez besoin de
saxon-HE
:la source
echo '<xml .. />' | xmllint --some-read-from-stdn-option
?libxml2-utils
dans ma belle Ubuntu.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 805: ordinal not in range(128)
en version python, vous voulez définirPYTHONIOENCODING="UTF-8"
:cat some.xml | PYTHONIOENCODING="UTF-8" python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print xml.dom.minidom.parseString(s).toprettyxml()' > pretty.xml
echo '<x></x><y></y>' | tidy -xml -iq
xmllint --format yourxmlfile.xml
xmllint est un outil XML en ligne de commande et est inclus dans
libxml2
( http://xmlsoft.org/ ).=================================================
Remarque: Si vous ne l'avez pas
libxml2
installé, vous pouvez l'installer en procédant comme suit:CentOS
Ubuntu
sudo apt-get install libxml2-utils
Cygwin
apt-cyg install libxml2
MacOS
Pour l'installer sur MacOS avec Homebrew, faites simplement:
brew install libxml2
Git
Aussi disponible sur Git si vous voulez le code:
git clone git://git.gnome.org/libxml2
la source
sudo apt-get install libxml2-utils
git
pour Windows, le téléchargement installe même une version récente dexmllint
. Exemple:"C:\Program Files\Git\usr\bin\xmllint.exe" --format [email protected] > [email protected]
Vous pouvez également utiliser tidy , qui peut avoir besoin d'être installé en premier (par exemple sur Ubuntu: sudo
apt-get install tidy
).Pour cela, vous émettriez quelque chose comme ceci:
Remarque: possède de nombreux indicateurs de lisibilité supplémentaires, mais le comportement de retour à la ligne est un peu ennuyeux à démêler ( http://tidy.sourceforge.net/docs/quickref.html ).
la source
tidy
fonctionne bien pour moi aussi. Contrairement àhxnormalize
cela, cette opération ferme la<body>
balise.tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml
.alias prettyxml='tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes | pygmentize -l xml'
et puis je peuxcurl url | prettyxml
Vous n'avez pas mentionné de fichier, donc je suppose que vous voulez fournir la chaîne XML comme entrée standard sur la ligne de commande. Dans ce cas, procédez comme suit:
la source
Sans rien installer sur macOS / la plupart des Unix.
Utilisation
tidy
cat filename.xml | tidy -xml -iq
Rediriger l'affichage d'un fichier avec cat pour ranger en spécifiant le type de fichier xml et pour mettre en retrait pendant une sortie silencieuse supprimera la sortie d'erreur. JSON fonctionne également avec
-json
.la source
cat
étape:tidy -xml -iq filename.xml
. En outre, vous pouvez même faire entidy -xml -iq filename.xml
utilisant l'-m
option pour modifier le fichier d'origine ...xmllint prend en charge la mise en forme sur place :
Comme Daniel Veillard l'a écrit:
Le niveau de retrait est contrôlé par
XMLLINT_INDENT
la variable d'environnement qui est par défaut de 2 espaces. Exemple de modification du retrait à 4 espaces:Il se peut que vous manquiez d'
--recover
option lorsque vos documents XML sont cassés. Ou essayez un analyseur HTML faible avec une sortie XML stricte:--nsclean
,--nonet
,--nocdata
,--noblanks
Etc peut être utile. Lisez la page de manuel.la source
Cela m'a pris une éternité pour trouver quelque chose qui fonctionne sur mon mac. Voici ce qui a fonctionné pour moi:
la source
Je voudrais ajouter une solution Bash pure, car ce n'est pas «si» difficile de le faire à la main, et parfois vous ne voudrez pas installer un outil supplémentaire pour faire le travail.
Collez-le dans un fichier de script et canalisez dans le xml. Cela suppose que le xml est sur une seule ligne et qu'il n'y a aucun espace supplémentaire nulle part. On pourrait facilement ajouter quelques extra
\s*
aux regex pour corriger cela.la source