Comment puis-je obtenir Python ElementTree pour la jolie imprimer dans un fichier XML?
Fond
J'utilise SQLite pour accéder à une base de données et d'extraire les informations souhaitées. Je suis en utilisant ElementTree dans la version de Python 2.6 pour créer un fichier XML avec cette information.
Code
import sqlite3
import xml.etree.ElementTree as ET
# NOTE: Omitted code where I acccess the database,
# pull data, and add elements to the tree
tree = ET.ElementTree(root)
# Pretty printing to Python shell for testing purposes
from xml.dom import minidom
print minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
####### Here lies my problem #######
tree.write("New_Database.xml")
Tentatives
J'ai essayé d'utiliser tree.write("New_Database.xml", "utf-8")
en place de la dernière ligne de code ci-dessus, mais il n'a pas modifier le code XML de la mise en page à tous - c'est toujours un pêle-mess.
J'ai aussi décidé de bricoler et essayé de faire:
tree = minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
au lieu de l'impression de ce à la Python shell, qui donne l'erreur AttributeError: 'unicode' objet n'a pas d'attribut 'écrire'.
Questions
Quand j'écris mon arbre dans un fichier XML sur la dernière ligne, il est un moyen assez de pression pour le fichier XML, comme il le fait pour le Python shell?
Puis-je utiliser toprettyxml()
ici ou est-il une autre façon de le faire?
OriginalL'auteur Kimbluey | 2015-03-02
Vous devez vous connecter pour publier un commentaire.
Quel que soit votre chaîne XML, vous pouvez l'écrire sur le fichier de votre choix par l'ouverture d'un fichier pour l'écriture et l'écriture de la chaîne dans le fichier.
Il est l'une des complications possibles, en particulier en Python 2, qui est à la fois moins stricte et moins sophistiqués sur les caractères Unicode dans les chaînes. Si votre
toprettyxml
méthode main d'une chaîne Unicode (u"something"
), alors vous pouvez vous lancer dans un encodage de fichier, tel que UTF-8. E. g. remplacer la une écriture ligne avec:import xml.dom.minidom as minidom
déclaration qui semble être nécessaire.Peut-être. Que l'importation apparaît dans la question d'origine, mais je l'ai ajouté ici, donc il n'y a pas de confusion.
Cette réponse est si souvent répété sur toute sorte de questions, mais c'est rien mais une bonne réponse: Vous avez pleinement besoin de convertir l'ensemble de l'arborescence XML à une chaîne, d'analyse, de nouveau, faire imprimer, cette fois, juste différemment. Ce n'est pas une bonne approche. Utilisation lxml au lieu et à la sérialisation directement à l'aide de la builtin méthode prévue par lxml, de cette façon, l'élimination de toute interemediate impression suivie par ré.
C'est une réponse sur la façon XML sérialisé est écrit dans un fichier, pas une approbation de l'OP de sérialisation de la stratégie, qui est sans doute Byzantine. J'aime
lxml
, mais étant basé sur le C, il n'est pas toujours disponible.Dans le cas où l'on veut utiliser lxml pourrait voir ma réponse ci-dessous.
OriginalL'auteur Jonathan Eunice
Installer
bs4
Utiliser ce code pour pretty print:
OriginalL'auteur RJX
Prendre un coup d'oeil à la vkbeautify module.
D'entrée et de sortie peuvent être de chaîne/fichier dans toutes les combinaisons. Il est très compact et n'ont pas de dépendance.
ValueError: stat: path too long for Windows
chaque fois que j'essaie de le lancer, je suppose parce que mon XML est plus longue que la restriction Windows de 255 caractères et c'est en essayant de voir si mon XML est un chemin d'entrée avant qu'il traite.OriginalL'auteur vadimk
Si on veut utiliser lxml, il pourrait être fait de la manière suivante:
Si vous voyez des espaces de noms xml par exemple
py:pytype="TREE"
, on pourrait vouloir ajouter avant la création dexml_object
Cela devrait être suffisant pour toute adaptation dans votre code.
Je ne suis pas entièrement sûr de ce que vous voulez dire. Je crois que je l'ai testé avec les deux
objectify
etetree
. Je vais revérifier, lorsque j'ai une chance, mais, il sera bon de clarifier la façon dont vous créez un objet racine directement à partir de lxml.Permettez-moi de voir si je peux générer un cas isolé. Mais le point est que j'ai eu un traitement basé sur l'importation de données xml.programme etree.ElementTree comme programme etree et j'avais un message d'erreur lorsque j'ai essayé ta suggestion.
OriginalL'auteur Nick