Relacionado: ¿Cómo puedo imprimir JSON en script de shell (unix)?
¿Existe un script de shell (unix) para formatear XML en forma legible para humanos?
Básicamente, quiero que transforme lo siguiente:
<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
... en algo como esto:
<root>
<foo a="b">lorem</foo>
<bar value="ipsum" />
</root>
xml
unix
command-line
svidgen
fuente
fuente

xmllintdisponible en los sistemas Debian, debe instalar el paquetelibxml2-utils(libxml2no proporciona esta herramienta, al menos no en Debian 5.0 "Lenny" y 6.0 "Squeeze").Respuestas:
libxml2-utilsEsta utilidad viene con
libxml2-utils:Perl's
XML::TwigEste comando viene con XML :: Twig perlmódulo, a veces
xml-twig-toolspaquete:xmlstarletEste comando viene con
xmlstarlet:tidyComprueba el
tidypaquete:Pitón
Python
xml.dom.minidompuede formatear XML (tanto python2 como python3):saxon-lintNecesitas
saxon-lint:saxon-HENecesitas
saxon-HE:fuente
echo '<xml .. />' | xmllint --some-read-from-stdn-option?libxml2-utilsen mi hermoso ubuntu.UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 805: ordinal not in range(128)en la versión de Python que desea definirPYTHONIOENCODING="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.xmlecho '<x></x><y></y>' | tidy -xml -iqxmllint --format yourxmlfile.xmlxmllint es una herramienta XML de línea de comando y se incluye en
libxml2( http://xmlsoft.org/ ).================================================
Nota: Si no lo ha
libxml2instalado, puede instalarlo haciendo lo siguiente:CentOS
Ubuntu
sudo apt-get install libxml2-utilsCygwin
apt-cyg install libxml2Mac OS
Para instalar esto en MacOS con Homebrew solo haz:
brew install libxml2Git
También disponible en Git si quieres el código:
git clone git://git.gnome.org/libxml2fuente
sudo apt-get install libxml2-utilsgitpara la descarga de Windows, incluso instala una versión reciente dexmllint. Ejemplo:"C:\Program Files\Git\usr\bin\xmllint.exe" --format [email protected] > [email protected]También puede usar tidy , que puede necesitar instalarse primero (por ejemplo, en Ubuntu: sudo
apt-get install tidy).Para esto, emitirías algo como lo siguiente:
Nota: tiene muchos indicadores de legibilidad adicionales, pero el comportamiento de ajuste de palabras es un poco molesto de desenredar ( http://tidy.sourceforge.net/docs/quickref.html ).
fuente
tidyA mí también me funciona bien. A diferencia dehxnormalizeesto, en realidad cierra la<body>etiqueta.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'y luego puedocurl url | prettyxmlNo mencionó un archivo, por lo que supongo que desea proporcionar la cadena XML como entrada estándar en la línea de comando. En ese caso, haga lo siguiente:
fuente
Sin instalar nada en macOS / most Unix.
Utilizar
tidycat filename.xml | tidy -xml -iqRedirigir la visualización de un archivo con cat para ordenar especificando el tipo de archivo de xml y sangrar mientras la salida silenciosa suprimirá la salida de error. JSON también funciona con
-json.fuente
catpaso:tidy -xml -iq filename.xml. Además, incluso puedestidy -xml -iq filename.xmlusar la-mopción para modificar el archivo original ...Formato de soporte de xmllint en el lugar :
Como Daniel Veillard ha escrito:
El nivel de sangría está controlado por
XMLLINT_INDENTla variable de entorno, que es por defecto 2 espacios. Ejemplo de cómo cambiar sangría a 4 espacios:Es posible que le falte la
--recoveropción cuando los documentos XML están rotos. O pruebe un analizador HTML débil con una salida XML estricta:--nsclean,--nonet,--nocdata,--noblanksEtc pueden ser útiles. Leer la página del manual.fuente
Esto me llevó una eternidad a encontrar algo que funcione en mi Mac. Esto es lo que funcionó para mí:
fuente
Me gustaría agregar una solución Bash pura, ya que no es 'tan' difícil hacerlo solo a mano, y a veces no querrá instalar una herramienta adicional para hacer el trabajo.
Pégalo en un archivo de secuencia de comandos y canaliza el xml Esto supone que el xml está todo en una línea y que no hay espacios adicionales en ningún lado. Uno podría agregar fácilmente algo extra
\s*a las expresiones regulares para arreglar eso.fuente