2013-07-18 6 views
5

Il mio programma legge fondamentalmente un file di input, crea un file lxml.etree da quel file, che ad esempio aggiungo un nodo all'Eree e quindi voglio stamparlo su un file. Quindi, per scrivere di nuovo su un file che uso:Formattazione dell'output come XML con lxml

et.write('Documents\Write.xml', pretty_print=True) 

E l'uscita che ho è:

<Variable Name="one" RefID="two"><Component Type="three"><Value>four</Value></Component></Variable> 

Mentre mi piacerebbe qualcosa di simile:

<Variable Name="one" RefID="two"> 
    <Component Type="three"> 
     <Value>four</Value> 
    </Component> 
</Variable> 

Dove am Mi sbaglio? Ho provato molte soluzioni ma nessuna sembra funzionare (beautifulsoup, ordinata, parser ...)

+0

potrebbe essere collegato a Windows? Se provi ad aprire il tuo file di output con il modulo 'io':' fp = io.open ('Documents \ Write.xml', 'w', newline = '\ r \ n') e poi'write a 'fp 'come quello' et.write (fp, pretty_print = True) ' (Vedi http://docs.python.org/2/library/io.html#io.open) –

+0

Ciao Paul, sto provando quello che dice ma cos'è la fp? Il file che voglio scrivere? Scusa, sono un principiante! – JAWE

+0

Solo un puntatore di file che rappresenta il file che si desidera scrivere, sì. 'et.write()' può prendere come input un nome file o un puntatore a file aperto, come qualcosa proveniente da 'io.open' (http://lxml.de/api/lxml.etree._ElementTree-class.html#write). Puoi provare 'import io' quindi' et.write (io.open ('Documents \ Write.xml', 'w', newline = '\ r \ n'), pretty_print = True) ' –

risposta

1

Questo è strano, perché è esattamente il modo in cui dovrebbe funzionare. Potrebbe provare questo:

root = etree.XML(YOUR XML STRING) 
print etree.tostring(root, pretty_print=True) 

<Variable Name="one" RefID="two"> 
    <Component Type="three"> 
    <Value>four</Value> 
    </Component> 
</Variable> 

Questo dovrebbe generare una stringa formattata, che è possibile elaborare da soli.

+1

Grazie per la risposta, ma è così che faccio. E in questo modo funziona, ma non quando scrivo su un file..non so perché! Grazie comunque. – JAWE

+0

Anche io sto facendo esattamente questo, ma ho riscontrato lo stesso problema di @JAWE – adubey

2

Non utilizzare il parser standard. Utilizza un parser personalizzato con remove_blank_text = True.

parser = etree.XMLParser(remove_blank_text=True) 
tree = etree.parse(self.output_file, parser=parser) 
// Do stuff with the tree here 
tree.write(your_output_file, pretty_print=True) 
+0

Ho avuto lo stesso problema e questo ha funzionato per me, la stessa risposta che ho qui: http://stackoverflow.com/questions/7903759/pretty-print-in- lxml-sta-venendo a mancare, quando-i-add-tag-ad-un-analizzato-albero – cptPH