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)
Ah! OK, non mi sono reso conto che stava riformando completamente il documento - grazie, è molto utile saperlo. –
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
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