Według the documentation:
write (plik, kodowanie = "us-ascii" xml_declaration = None, method = "xml")
Zapisuje drzewo elementów do pliku jako XML. plik to nazwa pliku lub obiekt pliku otwarty do zapisu. kodowanie 1 jest kodowaniem wyjściowym (domyślnie jest to US-ASCII). Elementy sterujące xml_declaration, jeśli do pliku należy dodać deklarację XML. Użyj Fałsz dla nigdy, Prawda zawsze, Brak tylko jeśli nie US-ASCII lub UTF-8 (domyślnie jest Brak). Metoda to "xml", "html" lub "text" (domyślnie jest to "xml"). Zwraca zakodowany ciąg.
Więc write(noteFile)
wyraźnie informując go napisać deklarację XML tylko wtedy, gdy nie jest kodowanie US-ASCII lub UTF-8, a kodowanie jest US-ASCII; dlatego nie otrzymujesz deklaracji.
Zgaduję, jeśli nie czytać tego dużo, następnym pytaniem będzie „Dlaczego Unicode złamane”, więc niech to naprawić oba naraz:
ET.ElementTree(root).write(noteFile, encoding="utf-8", xml_declaration=True)
Ah! OK, nie zdawałem sobie sprawy, że całkowicie zmieniłem dokument - dziękuję, to bardzo przydatne. –
Cóż, to zależy od implementacji ElementTree, aby zdecydować, czy wygenerować cały XML od zera, czy też ponownie wykorzystać istniejące elementy. Wierzę, że 'lxml' ma całkiem sprytne buforowanie, więc jeśli po prostu czytasz w małym pliku i zapisujesz go z powrotem, to ponownie wykorzystuje cały węzeł główny. Ale deklaracja nie jest częścią węzła głównego, więc naprawdę nie ma sposobu, aby to obejść. – abarnert
Jeśli powyższe zaakceptowane rozwiązanie nie działa dla ciebie, sprawdź odpowiedź @Olli, ponieważ jego mała poprawka uratowała mój dzień – ToTenMilan