2012-09-27 9 views
9

Piszę trochę XML z drzewem elementów.Python - Element Tree usuwa deklarację XML

Podaję kod pusty plik szablonu, który rozpoczyna się od deklaracji XML: <?xml version= "1.0"?>, gdy ET zakończył wprowadzanie zmian i zapisuje ukończony XML, pozbawiając go deklaracji i zaczynając od znacznika głównego. Jak mogę to zatrzymać?

Zapis wezwanie:

ET.ElementTree(root).write(noteFile)

Odpowiedz

18

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) 
+0

Ah! OK, nie zdawałem sobie sprawy, że całkowicie zmieniłem dokument - dziękuję, to bardzo przydatne. –

+1

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

+0

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

5

Istnieją różne wersje z ElementTree. Niektóre z nich akceptują argument xml_declaration, inne nie.

Ten, którego mam, nie ma. Emituje deklarację wtedy i tylko wtedy, gdy encoding != 'utf-8'. Tak więc, aby otrzymać deklarację, dzwonię pod numer write(filename, encoding='UTF-8').

+0

+1 To zadziałało dla mnie. Używam Pythona 2.6. – vwvolodya