2015-03-02 15 views
14

Sfondo

Sto utilizzando SQLite per accedere a un database e recuperare le informazioni desiderate. Sto usando ElementTree in Python versione 2.6 per creare un file XML con queste informazioni.Come faccio a ottenere in Python ElementTree una bella stampa su un file XML?

Codice

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") 

tentativi

Ho provato con tree.write("New_Database.xml", "utf-8") al posto del l'ultima riga di codice di cui sopra, ma non ha di modifica del layout del XML a tutti - è ancora un pasticcio confuso.

ho anche deciso di smanettare e provato a fare:
tree = minidom.parseString(ET.tostring(root)).toprettyxml(indent = " ")
invece di stampare questo alla shell Python, che dà l'errore di AttributeError : oggetto 'unicode' non ha alcun attributo 'scrittura'.

Domande

Quando scrivo il mio albero in un file XML sull'ultima riga, c'è un modo per stampare abbastanza al file XML, come fa per la shell Python?

Posso usare toprettyxml() qui o c'è un altro modo per farlo?

risposta

19

Qualunque sia la stringa XML, è possibile scriverla nel file desiderato aprendo un file per scrivere e scrivere la stringa sul file.

from xml.dom import minidom 

xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ") 
with open("New_Database.xml", "w") as f: 
    f.write(xmlstr) 

C'è una possibile complicanza, soprattutto in Python 2, che è sia meno rigida e meno sofisticata sui caratteri Unicode in stringhe. Se il metodo toprettyxml restituisce una stringa Unicode (u"something"), è possibile eseguire il cast in una codifica file adatta, come UTF-8. Per esempio. sostituire la linea uno di scrittura con:

f.write(xmlstr.encode('utf-8')) 
+0

Questa risposta sarebbe più chiara se si includesse l'istruzione 'import xml.dom.minidom as minidom' che sembra essere richiesta. –

+0

@KenPronovici Forse. Quella importazione appare nella domanda originale, ma l'ho aggiunta qui, quindi non c'è confusione. –

+0

Questa risposta viene ripetuta così spesso su qualsiasi tipo di domanda, ma è tutt'altro che una buona risposta: è necessario convertire completamente l'intero albero XML in una stringa, eseguirne di nuovo, per ottenerne nuovamente la stampa, questa volta in modo diverso. Questo non è un buon approccio. Utilizzare invece lxml e serializzare direttamente utilizzando il metodo incorporato fornito da lxml, in questo modo eliminando qualsiasi tipo di stampa immediata seguita da reparsing. –

3

Installare bs4

pip install bs4 

Usa questo codice per Pretty Print:

from bs4 import BeautifulSoup 

x = your xml 

print(BeautifulSoup(x, "xml").prettify()) 
+0

Questa è una buona soluzione per quando non vogliamo scrivere l'XML in un file. – FearlessFuture

1

Date un'occhiata al modulo vkbeautify.

L'input e l'output possono essere stringhe/file in qualsiasi combinazione. È molto compatto e non ha alcuna dipendenza.

import vkbeautify as vkb 

a) pretty_text = vkb.xml(your_xml_text) #return String 

b) vkb.xml(your_xml_text, 'path/to/dest/file') #save in file 
+0

Ho installato questo e ottengo 'ValueError: stat: percorso troppo lungo per Windows' ogni volta che provo a eseguire, presumo perché il mio XML è più lungo della restrizione di Windows di 255 caratteri e sta cercando di vedere se il mio XML è un input percorso prima di elaborarlo. –

Problemi correlati