Quelle est la meilleure façon (ou les différentes façons) d'imprimer du XML en Python?
python
xml
pretty-print
Hortitude
la source
la source
lxml est récent, mis à jour et inclut une jolie fonction d'impression
Consultez le didacticiel lxml: http://lxml.de/tutorial.html
la source
aptitude install
loin. Sous OS / X, je ne suis pas sûr.print(etree.tostring(x, pretty_print=True, encoding="unicode"))
. L'écriture dans un fichier de sortie est possible en une seule ligne, aucune variable intermédiaire nécessaire:etree.parse("filename").write("outputfile", encoding="utf-8")
Une autre solution consiste à emprunter cette
indent
fonction , pour une utilisation avec la bibliothèque ElementTree intégrée à Python depuis la 2.5. Voici à quoi cela ressemblerait:la source
tree.write([filename])
pour écrire dans un fichier (tree
étant l'instance ElementTree).tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
Voici ma solution (hacky?) Pour contourner le vilain problème de nœud de texte.
Le code ci-dessus produira:
Au lieu de cela:
Avis de non-responsabilité: il y a probablement des limitations.
la source
re.compile
avant l'sub
opération (j'utilisaisre.findall()
deux fois,zip
et unefor
boucle avecstr.replace()
...)Comme d'autres l'ont souligné, lxml a une jolie imprimante intégrée.
Sachez cependant que par défaut, il modifie les sections CDATA en texte normal, ce qui peut avoir des résultats désagréables.
Voici une fonction Python qui préserve le fichier d'entrée et ne change que l'indentation (remarquez le
strip_cdata=False
). De plus, il s'assure que la sortie utilise UTF-8 comme encodage au lieu de l'ASCII par défaut (notez leencoding='utf-8'
):Exemple d'utilisation:
la source
BeautifulSoup a une
prettify()
méthode facile à utiliser .Il indente un espace par niveau d'indentation. Il fonctionne beaucoup mieux que pretty_print de lxml et est court et doux.
la source
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
Si vous en avez,
xmllint
vous pouvez générer un sous-processus et l'utiliser.xmllint --format <file>
joli-imprime son XML d'entrée sur la sortie standard.Notez que cette méthode utilise un programme externe à python, ce qui en fait une sorte de hack.
la source
J'ai essayé de modifier la réponse de "ade" ci-dessus, mais Stack Overflow ne m'a pas laissé modifier après avoir initialement fourni des commentaires de manière anonyme. Il s'agit d'une version moins boguée de la fonction pour joliment imprimer un ElementTree.
la source
Si vous utilisez une implémentation DOM, chacun a sa propre forme de jolie impression intégrée:
Si vous utilisez autre chose sans sa propre jolie imprimante - ou si ces jolies imprimantes ne le font pas exactement comme vous le souhaitez - vous devrez probablement écrire ou sous-classer votre propre sérialiseur.
la source
J'ai eu quelques problèmes avec la jolie impression du minidom. J'obtiendrais un UnicodeError chaque fois que j'essayais de joliment imprimer un document avec des caractères en dehors du codage donné, par exemple si j'avais un β dans un document et que j'essayais
doc.toprettyxml(encoding='latin-1')
. Voici ma solution:la source
Il n'ajoutera pas d'espaces ou de nouvelles lignes à l'intérieur des nœuds de texte, sauf si vous le demandez avec:
Vous pouvez spécifier ce que l'unité d'indentation doit être et à quoi la nouvelle ligne doit ressembler.
Le doc est sur la page d' accueil http://www.yattag.org .
la source
J'ai écrit une solution pour parcourir un ElementTree existant et utiliser text / tail pour le mettre en retrait comme on s'y attend généralement.
la source
La jolie impression XML pour python semble assez bonne pour cette tâche. (Bien nommé aussi.)
Une alternative consiste à utiliser pyXML , qui a une fonction PrettyPrint .
la source
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/
Pensez que le projet est dans le grenier de nos jours, dommage.Vous pouvez utiliser la bibliothèque externe populaire xmltodict , avec
unparse
etpretty=True
vous obtiendrez le meilleur résultat:full_document=False
contre<?xml version="1.0" encoding="UTF-8"?>
en haut.la source
Voici une solution Python3 qui se débarrasse du vilain problème de nouvelle ligne (des tonnes d'espaces), et il utilise uniquement des bibliothèques standard contrairement à la plupart des autres implémentations.
J'ai trouvé comment résoudre le problème de saut de ligne courant ici .
la source
Jetez un oeil à la vkbeautify module .
C'est une version python de mon plugin javascript / nodejs très populaire avec le même nom. Il peut joliment imprimer / réduire le texte XML, JSON et CSS. L'entrée et la sortie peuvent être des chaînes / fichiers dans n'importe quelle combinaison. Il est très compact et n'a aucune dépendance.
Exemples :
la source
Une alternative si vous ne voulez pas avoir à refaire l'analyse, il y a la bibliothèque xmlpp.py avec la
get_pprint()
fonction. Cela a fonctionné bien et en douceur pour mes cas d'utilisation, sans avoir à analyser à nouveau un objet ElementTree lxml.la source
Vous pouvez essayer cette variante ...
Installation
BeautifulSoup
etlxml
bibliothèques backend (analyseur):Traitez votre document XML:
la source
'lxml'
utilise l' analyseur HTML de lxml - voir la documentation BS4 . Vous avez besoin de'xml'
ou'lxml-xml'
pour l'analyseur XML.lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
lxml-xml
), puis ils ont procédé à downvote ce même jour. J'ai déposé une plainte officielle auprès de S / O, mais ils ont refusé d'enquêter. Quoi qu'il en soit, j'ai depuis "dé-falsifié" ma réponse, qui est maintenant à nouveau correcte (et préciselxml-xml
comme c'était le cas à l'origine). Je vous remercie.J'ai eu ce problème et je l'ai résolu comme ceci:
Dans mon code, cette méthode est appelée comme ceci:
Cela ne fonctionne que parce que etree utilise par défaut l'
two spaces
indentation, que je ne trouve pas beaucoup mettant l'accent sur l'indentation et donc pas joli. Je ne pouvais pas trouver de paramètre pour etree ou de paramètre pour n'importe quelle fonction pour changer le retrait standard etree. J'aime la facilité d'utilisation d'etree, mais cela m'a vraiment énervé.la source
Pour convertir un document xml entier en un joli document xml
(ex: en supposant que vous avez extrait [décompressé] un fichier LibreOffice Writer .odt ou .ods, et que vous voulez convertir le vilain fichier "content.xml" en un joli pour contrôle de version git automatisé et
git difftool
ing de fichiers .odt / .ods , comme je l'implémente ici )Références:
- Merci à la réponse de Ben Noland sur cette page qui m'a le plus amené là-bas.
la source
Cela fonctionne bien pour le xml avec le chinois!
la source
Si pour une raison quelconque, vous ne pouvez pas mettre la main sur l'un des modules Python mentionnés par d'autres utilisateurs, je suggère la solution suivante pour Python 2.7:
Pour autant que je sache, cette solution fonctionnera sur les systèmes basés sur Unix sur lesquels le
xmllint
package est installé.la source
check_output
car vous n'avez pas besoin de vérifier les erreursJ'ai résolu cela avec quelques lignes de code, en ouvrant le fichier, en le parcourant et en ajoutant une indentation, puis en l'enregistrant à nouveau. Je travaillais avec de petits fichiers xml et je ne voulais pas ajouter de dépendances ou plus de bibliothèques à installer pour l'utilisateur. Quoi qu'il en soit, voici ce que j'ai fini avec:
Cela fonctionne pour moi, peut-être que quelqu'un l'utilisera :)
la source