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
xmllint
disponible en los sistemas Debian, debe instalar el paquetelibxml2-utils
(libxml2
no proporciona esta herramienta, al menos no en Debian 5.0 "Lenny" y 6.0 "Squeeze").Respuestas:
libxml2-utils
Esta utilidad viene con
libxml2-utils
:Perl's
XML::Twig
Este comando viene con XML :: Twig perlmódulo, a veces
xml-twig-tools
paquete:xmlstarlet
Este comando viene con
xmlstarlet
:tidy
Comprueba el
tidy
paquete:Pitón
Python
xml.dom.minidom
puede formatear XML (tanto python2 como python3):saxon-lint
Necesitas
saxon-lint
:saxon-HE
Necesitas
saxon-HE
:fuente
echo '<xml .. />' | xmllint --some-read-from-stdn-option
?libxml2-utils
en 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.xml
echo '<x></x><y></y>' | tidy -xml -iq
xmllint --format yourxmlfile.xml
xmllint es una herramienta XML de línea de comando y se incluye en
libxml2
( http://xmlsoft.org/ ).================================================
Nota: Si no lo ha
libxml2
instalado, puede instalarlo haciendo lo siguiente:CentOS
Ubuntu
sudo apt-get install libxml2-utils
Cygwin
apt-cyg install libxml2
Mac OS
Para instalar esto en MacOS con Homebrew solo haz:
brew install libxml2
Git
También disponible en Git si quieres el código:
git clone git://git.gnome.org/libxml2
fuente
sudo apt-get install libxml2-utils
git
para 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
tidy
A mí también me funciona bien. A diferencia dehxnormalize
esto, 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 | prettyxml
No 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
tidy
cat filename.xml | tidy -xml -iq
Redirigir 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
cat
paso:tidy -xml -iq filename.xml
. Además, incluso puedestidy -xml -iq filename.xml
usar la-m
opció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_INDENT
la 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
--recover
opción cuando los documentos XML están rotos. O pruebe un analizador HTML débil con una salida XML estricta:--nsclean
,--nonet
,--nocdata
,--noblanks
Etc 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