Obecnie najbardziej popularną (i bardzo prostą) opcją jest API ElementTree , które jest dołączone do standardowej biblioteki od czasu Pythona 2.5.
Dostępne opcje to:
- ElementTree (podstawowa, czysto Pythonowa implementacja ElementTree. Część biblioteki standardowej od 2.5)
- cElementTree (zoptymalizowana implementacja ElementTree w C. Od 2.5 dostępna również w bibliotece standardowej)
- LXML (oparty na libxml2. Oferuje bogaty nadzbiór API ElementTree, a także XPath, selektory CSS i nie tylko)
Oto przykład tego, jak wygenerować przykładowy dokument przy użyciu cElementTree w standardowej bibliotece:
import xml.etree.cElementTree as ET
root = ET.Element("root")
doc = ET.SubElement(root, "doc")
ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"
tree = ET.ElementTree(root)
tree.write("filename.xml")
Przetestowałem to i działa, ale zakładam, że białe spacje nie mają znaczenia. Jeśli potrzebujesz wcięcia „prettyprint”, daj mi znać, a sprawdzę, jak to zrobić. (Może to być opcja specyficzna dla LXML. Nie używam zbyt często implementacji standardowej biblioteki)
Aby uzyskać więcej informacji, oto kilka przydatnych linków:
Na koniec, albo cElementTree, albo LXML powinny być wystarczająco szybkie dla wszystkich twoich potrzeb (oba są zoptymalizowanym kodem C), ale jeśli jesteś w sytuacji, w której musisz wycisnąć każdy ostatni kawałek wydajności, testy porównawcze witryna LXML wskazuje, że:
- LXML wyraźnie wygrywa w serializacji (generowaniu) XML
- Jako efekt uboczny implementacji prawidłowego przechodzenia przez rodzica, LXML jest nieco wolniejszy niż cElementTree pod względem analizy.
xml_declaration=True
wtedy, gdy określisz kodowanie ... ale aby uzyskać równoważne zachowanie, wywołaj wtree.write()
ten sposób:tree.write("filename.xml", xml_declaration=True, encoding='utf-8')
Możesz użyć dowolnego kodowania, o ile wyraźnie określisz jeden. (ascii
wymusi na wszystkich znakach Unicode spoza 7-bitowego zestawu ASCII kodowanie encji, jeśli nie ufasz prawidłowej konfiguracji serwera WWW).vlaue2
navalue2
: the typo jest w wymaganym wyjściu XML w oryginalnym pytanie. Dopóki to się nie zmieni, literówka tutaj jest poprawna.cElementTree
został zdeprecjonowany w Pythonie 3.3Biblioteka lxml zawiera bardzo wygodny składni XML generacji, zwany e-fabryka . Oto jak zrobiłbym przykład, który podasz:
Wynik:
Obsługuje również dodawanie do już utworzonego węzła, np. Po powyższym można by powiedzieć
źródło
getattr
npgetattr(E, "some-tag")
.Yattag http://www.yattag.org/ lub https://github.com/leforestier/yattag udostępnia interesujące API do tworzenia takich dokumentów XML (a także dokumentów HTML).
Używa menedżera kontekstu i
with
słowa kluczowego.więc otrzymasz:
źródło
Najprostszy wybór to minidom: http://docs.python.org/library/xml.dom.minidom.html . Jest wbudowany w standardową bibliotekę Pythona i jest łatwy w użyciu w prostych przypadkach.
Oto całkiem prosty samouczek: http://www.boddie.org.uk/python/XML_intro.html
źródło
W przypadku tak prostej struktury XML możesz nie chcieć angażować pełnego modułu XML. Rozważ szablon łańcucha dla najprostszych struktur lub Jinja dla czegoś nieco bardziej złożonego. Jinja może obsłużyć zapętlenie listy danych w celu utworzenia wewnętrznego XML listy dokumentów. Jest to nieco trudniejsze w przypadku szablonów surowych ciągów znaków Pythona
Aby zapoznać się z przykładem Jinja, zobacz moją odpowiedź na podobne pytanie .
Oto przykład generowania pliku XML za pomocą szablonów ciągów.
Wynik:
Wadą podejścia opartego na szablonach jest to, że nie dostaniesz ucieczki
<
i>
za darmo. Tańczyłem wokół tego problemu, ściągając narzędzie zxml.sax
źródło
Właśnie skończyłem pisać generator XML, używając metody szablonów bigh_29 ... to dobry sposób na kontrolowanie tego, co generujesz, bez zbyt wielu obiektów przeszkadzających.
Jeśli chodzi o tag i wartość, użyłem dwóch tablic, jednej, która podawała nazwę i pozycję znacznika w wyjściowym pliku XML, a drugiej, która odwoływała się do pliku parametrów z tą samą listą tagów. Plik parametrów zawiera jednak również numer pozycji w odpowiednim pliku wejściowym (csv), z którego zostaną pobrane dane. W ten sposób, jeśli nastąpią jakiekolwiek zmiany w pozycji danych przychodzących z pliku wejściowego, program się nie zmieni; dynamicznie ustala pozycję pola danych z odpowiedniego tagu w pliku parametrów.
źródło