2012-09-27 9 views
9

Sto scrivendo un po 'di XML con l'albero degli elementi.Python - Element Tree sta rimuovendo la dichiarazione XML

Fornisco al codice un file modello vuoto che inizia con la dichiarazione XML: <?xml version= "1.0"?> quando ET ha terminato di apportare le modifiche e scrive l'XML completato rimuovendo la dichiarazione e iniziando con il tag radice. Come posso fermarlo?

scrittura chiamata:

ET.ElementTree(root).write(noteFile)

risposta

18

Secondo the documentation:

scrittura (file, encoding = "us-ascii", xml_declaration = Nessuno, method = "xml")

Scrive la struttura ad albero in un file, come XML. file è un nome file o un oggetto file aperto per la scrittura. codifica 1 è la codifica dell'output (l'impostazione predefinita è US-ASCII). xml_declaration controlla se una dichiarazione XML deve essere aggiunta al file. Usa False per mai, True per sempre, Nessuna per solo se non US-ASCII o UTF-8 (l'impostazione predefinita è Nessuno). il metodo è "xml", "html" o "text" (il valore predefinito è "xml"). Restituisce una stringa codificata.

Quindi, write(noteFile) sta dicendo esplicitamente di scrivere una dichiarazione XML solo se la codifica non è US-ASCII o UTF-8, e che la codifica è US-ASCII; quindi, non ottieni nessuna dichiarazione.

Sto indovinando se non avete letto questo molto, la prossima domanda sarà "perché è il mio Unicode rotto", quindi cerchiamo di fissare entrambi contemporaneamente:

ET.ElementTree(root).write(noteFile, encoding="utf-8", xml_declaration=True) 
+0

Ah! OK, non mi sono reso conto che stava riformando completamente il documento - grazie, è molto utile saperlo. –

+1

Bene, dipende dall'implementazione di ElementTree decidere se generare l'intero XML da zero o riutilizzare pezzi esistenti. Credo che 'lxml' abbia una cache piuttosto intelligente, quindi se si legge un file piccolo e lo si ri-scrive, riutilizza l'intero nodo radice. Ma la dichiarazione non fa parte del nodo radice, quindi non c'è davvero modo di aggirare il problema. – abarnert

+0

Se la soluzione sopra accettata non funziona per voi, si prega di controllare la risposta di @Olli come il suo piccolo ritocco salvato la mia giornata – ToTenMilan

5

Ci sono diverse versioni di ElementTree. Alcuni accettano l'argomento xml_declaration, altri no.

Quello che mi capita di no. Emette la dichiarazione se e solo se encoding != 'utf-8'. Quindi, per ottenere la dichiarazione, chiamo write(filename, encoding='UTF-8').

+0

+1 che ha funzionato per me. Io uso Python 2.6. – vwvolodya

Problemi correlati