¿Cuál es la mejor manera (o son varias) para imprimir bastante XML en Python?
python
xml
pretty-print
Hortitude
fuente
fuente
lxml es reciente, actualizado e incluye una bonita función de impresión
Consulte el tutorial lxml: http://lxml.de/tutorial.html
fuente
aptitude install
lejos. Bajo OS / X no estoy seguro.print(etree.tostring(x, pretty_print=True, encoding="unicode"))
. Escribir en un archivo de salida es posible en una sola línea, no se necesita una variable intermedia:etree.parse("filename").write("outputfile", encoding="utf-8")
Otra solución es tomar prestada esta
indent
función , para usar con la biblioteca ElementTree que está integrada en Python desde 2.5. Así es como se vería:fuente
tree.write([filename])
para escribir en el archivo (tree
siendo la instancia de ElementTree).tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
Aquí está mi solución (¿hacky?) Para solucionar el problema del nodo de texto feo.
El código anterior producirá:
En lugar de esto:
Descargo de responsabilidad: probablemente hay algunas limitaciones.
fuente
re.compile
antes de lasub
operación (la estaba usandore.findall()
dos veceszip
y unfor
ciclo constr.replace()
...)Como otros señalaron, lxml tiene una bonita impresora integrada.
Sin embargo, tenga en cuenta que, de forma predeterminada, cambia las secciones CDATA a texto normal, lo que puede tener resultados desagradables.
Aquí hay una función de Python que conserva el archivo de entrada y solo cambia la sangría (observe la
strip_cdata=False
). Además, se asegura de que la salida use UTF-8 como codificación en lugar del ASCII predeterminado (observe elencoding='utf-8'
):Ejemplo de uso:
fuente
BeautifulSoup tiene un
prettify()
método fácil de usar .Sangra un espacio por nivel de sangría. Funciona mucho mejor que pretty_print de lxml y es corto y dulce.
fuente
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
Si lo tiene
xmllint
, puede generar un subproceso y usarlo.xmllint --format <file>
pretty-imprime su entrada XML a la salida estándar.Tenga en cuenta que este método utiliza un programa externo a Python, lo que lo convierte en una especie de hack.
fuente
Traté de editar la respuesta de "ade" anterior, pero Stack Overflow no me permitió editar después de haber proporcionado comentarios de forma anónima. Esta es una versión menos defectuosa de la función para imprimir bonitamente un ElementTree.
fuente
Si está utilizando una implementación DOM, cada uno tiene su propia forma de impresión bonita incorporada:
Si está utilizando otra cosa sin su propia impresora bonita, o si esas impresoras bonitas no lo hacen de la manera deseada, probablemente tenga que escribir o subclasificar su propio serializador.
fuente
Tuve algunos problemas con la bonita impresión de minidom. Obtendía un UnicodeError cada vez que intentaba imprimir un documento con caracteres fuera de la codificación dada, por ejemplo, si tenía un β en un documento y lo intentaba
doc.toprettyxml(encoding='latin-1')
. Aquí está mi solución para ello:fuente
No agregará espacios o nuevas líneas dentro de los nodos de texto, a menos que lo solicite con:
Puede especificar cuál debería ser la unidad de sangría y cómo debería verse la nueva línea.
El documento está en la página de inicio de http://www.yattag.org .
fuente
Escribí una solución para recorrer un ElementTree existente y usar text / tail para sangrarlo como normalmente se espera.
fuente
La impresión bonita de XML para Python se ve bastante bien para esta tarea. (Apropiadamente nombrado, también.)
Una alternativa es usar pyXML , que tiene una función PrettyPrint .
fuente
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/
Creo que el proyecto está en el ático hoy en día, lástima.Puede usar la popular biblioteca externa xmltodict , con
unparse
ypretty=True
obtendrá el mejor resultado:full_document=False
en contra<?xml version="1.0" encoding="UTF-8"?>
en la parte superior.fuente
Aquí hay una solución Python3 que elimina el feo problema de la nueva línea (toneladas de espacios en blanco), y solo usa bibliotecas estándar a diferencia de la mayoría de las otras implementaciones.
Encontré cómo solucionar el problema común de nueva línea aquí .
fuente
Echa un vistazo al módulo vkbeautify .
Es una versión de Python de mi muy popular complemento javascript / nodejs con el mismo nombre. Puede imprimir / minificar bastante texto XML, JSON y CSS. La entrada y la salida pueden ser cadenas / archivos en cualquier combinación. Es muy compacto y no tiene ninguna dependencia.
Ejemplos :
fuente
Una alternativa si no desea volver a analizar, existe la biblioteca xmlpp.py con la
get_pprint()
función. Funcionó bien y sin problemas para mis casos de uso, sin tener que volver a analizarlo en un objeto lxml ElementTree.fuente
Puedes probar esta variación ...
Instalar
BeautifulSoup
y laslxml
bibliotecas de backend (analizador):Procese su documento XML:
fuente
'lxml'
utiliza el analizador HTML de lxml ; consulte los documentos de BS4 . Necesita'xml'
o'lxml-xml'
para el analizador XML.lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
lxml-xml
), y luego procedió a votarlo ese mismo día. Envié una queja oficial a S / O pero se negaron a investigar. De todos modos, desde entonces "des-manipulé" mi respuesta, que ahora es correcta nuevamente (y especificalxml-xml
como lo hizo originalmente). Gracias.Tuve este problema y lo resolví así:
En mi código, este método se llama así:
Esto funciona solo porque etree por defecto usa
two spaces
sangría, lo que no encuentro enfatizando mucho la sangría y, por lo tanto, no es bonita. No pude encontrar ninguna configuración para etree o parámetro para ninguna función para cambiar la sangría etree estándar. Me gusta lo fácil que es usar etree, pero esto realmente me molestó.fuente
Para convertir un documento xml completo en un documento xml bonito
(por ejemplo, suponiendo que ha extraído [descomprimido] un archivo .odt o .ods de LibreOffice Writer, y desea convertir el archivo feo "content.xml" en uno bonito para control automatizado de versiones git e
git difftool
ing de archivos .odt / .ods , como los que estoy implementando aquí )Referencias:
- Gracias a la respuesta de Ben Noland en esta página que me llevó casi todo el camino.
fuente
¡Funciona bien para el xml con chino!
fuente
Si por alguna razón no puede tener en sus manos ninguno de los módulos de Python que mencionaron otros usuarios, sugiero la siguiente solución para Python 2.7:
Hasta donde sé, esta solución funcionará en sistemas basados en Unix que tengan el
xmllint
paquete instalado.fuente
check_output
porque no es necesario que verifique los erroresResolví esto con algunas líneas de código, abriendo el archivo, revisándolo y agregando sangría, luego guardándolo nuevamente. Estaba trabajando con pequeños archivos xml, y no quería agregar dependencias, o más bibliotecas para instalar para el usuario. De todos modos, esto es lo que terminé con:
Funciona para mí, tal vez alguien lo use :)
fuente