Przetwarzanie XML w Pythonie [zamknięte]

Mam zamiar zbudować kawałek projektu, który będzie musiał skonstruować i opublikować dokument XML w serwisie internetowym i chciałbym to zrobić w Pythonie, jako środek do poszerzenia moich umiejętności w tym zakresie.

Niestety, chociaż znam model XML dość dobrze w. Net, nie jestem pewien, jakie są plusy i minusy modeli XML w Pythonie.

Ktoś ma doświadczenie w przetwarzaniu XML w Pythonie? Od czego mam zacząć? Pliki XML, które będę budować będą dość proste.

 65
Author: piRSquared, 2008-08-02

12 answers

Osobiście grałem z kilkoma wbudowanymi opcjami w projekcie ciężkim w XML i zdecydowałem się na pulldom jako najlepszy wybór dla mniej złożonych dokumentów.

Szczególnie w przypadku małych prostych rzeczy, lubię teorię parsowania opartą na zdarzeniach, a nie konfigurowanie całego mnóstwa wywołań zwrotnych dla stosunkowo prostej struktury. oto dobra szybka dyskusja na temat korzystania z API .

Co lubię: możesz obsługiwać parsowanie w pętli for, a nie korzystanie z połączeń zwrotnych. Opóźniasz również pełne parsowanie (część "pull") i uzyskujesz dodatkowe szczegóły tylko po wywołaniu expandNode(). Spełnia to moje ogólne wymagania dotyczące" odpowiedzialnej " wydajności bez poświęcania łatwości użytkowania i prostoty.

 26
Author: saint_groceon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 04:01:34

ElementTree ma ładne API pythony. Myślę, że jest nawet dostarczany jako część Pythona 2.5

Jest w czystym Pythonie i jak mówię, całkiem nieźle, ale jeśli potrzebujesz większej wydajności, to lxml Wyświetla to samo API i używa libxml2 pod maską. Teoretycznie możesz go po prostu wymienić, gdy odkryjesz, że go potrzebujesz.

 32
Author: Gareth Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 15:21:03

Istnieją 3 główne sposoby radzenia sobie z XML, ogólnie: dom, sax i xpath. Model dom jest dobry, jeśli możesz sobie pozwolić na załadowanie całego pliku xml do pamięci na raz, i nie masz nic przeciwko zajmowaniu się strukturami danych, a patrzysz na wiele / większość modelu. Model sax jest świetny, jeśli zależy Ci tylko na kilku tagach i / lub masz do czynienia z dużymi plikami i możesz je przetwarzać sekwencyjnie. Model xpath jest po trochu z każdego - możesz wybierać ścieżki do elementów danych, które potrzeba, ale wymaga więcej bibliotek do użycia.

Jeśli chcesz prostego i spakowanego z Pythonem, minidom jest twoją odpowiedzią, ale jest dość kiepski, a dokumentacja brzmi "oto dokumenty na dom, idź to rozgryźć". To naprawdę irytujące.

Osobiście lubię cElementTree, który jest szybszą (opartą na c) implementacją ElementTree, która jest modelem podobnym do dom.

Używałem systemów saksofonowych i pod wieloma względami są bardziej "pythoniczne" w ich odczuciu, ale zazwyczaj kończę tworząc systemy państwowe do ich obsługi, a w ten sposób leży szaleństwo (i błędy).

Mówię go z minidom, jeśli lubisz badania, lub ElementTree, jeśli chcesz dobry kod, który działa dobrze.

 6
Author: Kent Quirk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 04:35:28

Użyłem ElementTree w kilku projektach i polecam.

To pythonic, jest "w pudełku" z Pythonem 2.5, W tym w wersji C cElementTree (xml.etree.cElementTree), który jest 20 razy szybszy niż czysta wersja Pythona i jest bardzo łatwy w użyciu.

Lxml ma pewne zalety perfomancji, ale są one nierówne i powinieneś najpierw sprawdzić benchmarki pod kątem twojego przypadku użycia.

Jak rozumiem, Kod ElementTree można łatwo przenieść do lxml.

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-23 19:42:58

To zależy trochę od tego, jak skomplikowany musi być dokument.

Używałem minidom dużo do pisania XML, ale to zwykle było tylko czytanie dokumentów, dokonywanie prostych przekształceń i zapisywanie ich z powrotem. To działało wystarczająco dobrze, dopóki nie potrzebowałem możliwości porządkowania atrybutów elementów(aby zaspokoić starożytną aplikację, która nie parsuje poprawnie XML). W tym momencie poddałem się i sam napisałem XML.

Jeśli pracujesz tylko nad prostymi dokumentami, to zrób to możesz być szybszy i prostszy niż nauka frameworka. Jeśli można pisać XML ręcznie, To prawdopodobnie można również kodować go ręcznie (pamiętaj tylko, aby odpowiednio unikać znaków specjalnych i użyć str.encode(codec, errors="xmlcharrefreplace")). Oprócz tych błędów, XML jest na tyle regularny, że nie potrzebujesz specjalnej biblioteki, aby go napisać. Jeśli dokument jest zbyt skomplikowany, aby pisać go ręcznie, prawdopodobnie powinieneś zajrzeć do jednej z już wymienionych frameworków. W żadnym momencie nie trzeba pisać ogólny writer XML.

 6
Author: giltay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-14 18:26:04

Ponieważ wspomniałeś, że będziesz budować "dość prosty" XML, minidom Moduł (część standardowej biblioteki Pythona) będzie prawdopodobnie odpowiadał Twoim potrzebom. Jeśli masz jakieś doświadczenie z reprezentacją DOM XML, powinieneś znaleźć API całkiem prosto.

 5
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 18:04:10

Możesz również spróbować rozplątać , aby przeanalizować proste dokumenty XML.

 5
Author: Jabba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-31 14:05:09

Piszę serwer SOAP, który odbiera żądania XML i tworzy odpowiedzi XML. (Niestety nie jest to mój projekt, więc jest to closed source, ale to kolejny problem).

Okazało się dla mnie, że tworzenie (SOAP) dokumentów XML jest dość proste, jeśli masz strukturę danych, która "pasuje" do schematu.

Zachowuję kopertę, ponieważ koperta odpowiedzi jest (prawie) taka sama jak koperta żądania. Następnie, ponieważ moja struktura danych jest (prawdopodobnie zagnieżdżonym) słownikiem, tworzę łańcuch, który zamienia ten słownik wwartość pozycje.

Jest to zadanie, które rekurencja czyni prostym, a ja kończę z właściwą strukturą. Wszystko to odbywa się w kodzie Pythona i jest obecnie wystarczająco szybkie do użytku produkcyjnego.

Możesz również (stosunkowo) łatwo budować listy, chociaż w zależności od klienta możesz napotkać problemy, chyba że podasz wskazówki dotyczące długości.

Dla mnie było to o wiele prostsze, ponieważ słownik jest o wiele łatwiejszym sposobem pracy niż niektóre Klasa niestandardowa. W przypadku książek generowanie XML jest znacznie łatwiejsze niż parsowanie!

 4
Author: Matthew Schinckel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-03 08:34:57

Do poważnej pracy z XML w Pythonie użyj lxml

Python jest wyposażony w bibliotekę ElementTree, ale lxml rozszerza ją pod względem szybkości i funkcjonalności (Walidacja schematu, parsowanie saksofonu, XPath, różnego rodzaju Iteratory i wiele innych funkcji).

Trzeba go zainstalować, ale w wielu miejscach zakłada się, że jest już częścią standardowego wyposażenia (np. Google AppEngine nie zezwala na pakiety Pythona oparte na C, ale czyni wyjątek dla lxml, pyyaml i few inne).

Budowanie dokumentów XML za pomocą E-factory (z lxml)

Twoje pytanie dotyczy budowania dokumentu XML.

Z lxml jest wiele metod i zajęło mi trochę czasu znalezienie tej, która wydaje się być łatwa w użyciu, a także łatwa do odczytania.

Przykładowy kod z lxml doc na temat korzystania z E-factory (nieco uproszczony):


E-factory dostarcza prostą i zwartą składnię do generowania XML i HTML:
>>> from lxml.builder import E

>>> html = page = (
...   E.html(       # create an Element called "html"
...     E.head(
...       E.title("This is a sample document")
...     ),
...     E.body(
...       E.h1("Hello!"),
...       E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
...       E.p("This is another paragraph, with a", "\n      ",
...         E.a("link", href="http://www.python.org"), "."),
...       E.p("Here are some reserved characters: <spam&egg>."),
...     )
...   )
... )

>>> print(etree.tostring(page, pretty_print=True))
<html>
  <head>
    <title>This is a sample document</title>
  </head>
  <body>
    <h1>Hello!</h1>
    <p>This is a paragraph with <b>bold</b> text in it!</p>
    <p>This is another paragraph, with a
      <a href="http://www.python.org">link</a>.</p>
    <p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

Doceniam na E-factory it following things

Kod czyta się prawie jak wynikowy dokument XML

Liczy się czytelność.

Umożliwia tworzenie dowolnej zawartości XML

Obsługuje takie rzeczy jak:

  • użycie przestrzeni nazw
  • początkowe i końcowe węzły tekstu w obrębie jednego elementu
  • funkcje formatujące zawartość atrybutu (patrz Klasa func w Pełna próbka lxml )

Pozwala na bardzo czytelne konstrukcje z listy

Np.:

from lxml import etree
from lxml.builder import E
lst = ["alfa", "beta", "gama"]
xml = E.root(*[E.record(itm) for itm in lst])
etree.tostring(xml, pretty_print=True)

W wyniku:

<root>
  <record>alfa</record>
  <record>beta</record>
  <record>gama</record>
</root>

Wnioski

Gorąco polecam lekturę lxml tutorial - jest bardzo dobrze napisany i daje o wiele więcej powodów do korzystania z tej potężnej biblioteki.

Jedyną wadą lxml jest to, że musi być skompilowany. Zobacz więc odpowiedź na więcej porad Jak zainstalować lxml z pakietu wheel format w ułamku sekundy.

 3
Author: Jan Vlcinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:40

Zakładam, że. Net-sposób przetwarzania XML opiera się na som wersji MSXML i w tym przypadku zakładam, że Korzystanie na przykład minidom sprawi, że poczujesz się trochę jak w domu. Jeśli jednak jest to proste przetwarzanie, które robisz, prawdopodobnie zrobi to każda biblioteka.

Ja też preferuję pracę z ElementTree podczas pracy z xml w Pythonie, jest to bardzo zgrabna biblioteka.

 1
Author: mbesso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 06:20:01

Jeśli masz zamiar budować wiadomości SOAP, sprawdź soaplib . Używa ElementTree pod maską, ale zapewnia znacznie czystszy interfejs do serializacji i deserializacji wiadomości.

 1
Author: William McVey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-13 22:17:10

Zdecydowanie polecam SAX - Simple API for XML - implementację w bibliotekach Pythona. Są one dość łatwe do skonfigurowania i przetworzenia dużych XML przez even driven API, Jak wspomniano w poprzednich plakatach tutaj, i mają niski ślad pamięci w przeciwieństwie do sprawdzania parserów DOM style XML.

 1
Author: Arcturus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 06:47:24