Przetwarzanie XML w Pythonie

głosy
61

Mam zamiar zbudować kawałek projektu, które będą potrzebne do budowy i pisać dokument XML do usługi internetowej i chciałbym zrobić to w Pythonie, jako środek do poszerzenia swoich umiejętności w nim.

Niestety, podczas gdy ja znać model XML w .NET dość dobrze, jestem niepewny co plusy i minusy są z modeli XML w Pythonie.

Ktoś ma doświadczenie robi przetwarzania XML w Pythonie? Gdzie proponujesz zacząć? Pliki XML będę budynek będzie dość proste.

Utwórz 02/08/2008 o 04:35
źródło użytkownik
W innych językach...                            


16 odpowiedzi

głosy
6

Zanurkuj w Pythonie zawiera rozdział. Nie mogę wypowiedzieć się na jak dobrze byłoby chociaż.

Odpowiedział 02/08/2008 o 04:43
źródło użytkownik

głosy
22

Osobiście grałem z kilkoma wbudowanymi opcjami na projekcie XML-ciężki i osiedlili na pulldom jako najlepszy wybór dla mniej skomplikowanych dokumentów.

Specjalnie dla małych prostych rzeczy, lubię zdarzeniami teorii parsowania zamiast konfigurowania całe mnóstwo wywołań zwrotnych dla stosunkowo prostej konstrukcji. Oto dobry szybkie omówienie sposobu korzystania z API .

Co lubię: można obsługiwać parsowania w forpętli zamiast używać wywołania zwrotne. Ty też opóźnić pełnego parsowania (dalej „ciągnąć” część), a tylko uzyskać dodatkowe szczegóły podczas rozmowy expandNode(). To spełnia moje ogólny wymóg „odpowiedzialnego” wydajność bez poświęcania łatwość użytkowania i prostotę.

Odpowiedział 02/08/2008 o 05:01
źródło użytkownik

głosy
30

ElementTree ma ładny pythony API. Myślę, że to nawet dostarczane jako część Python 2.5

Jest w czystym Pythonie i jak mówię, bardzo ładne, ale jeśli skończyć wymagających większej wydajności, a następnie lxml naraża samego API i wykorzystuje libxml2 pod maską. Można teoretycznie tylko zamienić ją, gdy okazuje jest to potrzebne.

Odpowiedział 02/08/2008 o 16:21
źródło użytkownik

głosy
3

Skoro wspomniałeś, że będziesz budynku „dość proste” xml, tym module minidom (część Python Standard Library) prawdopodobnie będzie odpowiadał naszym potrzebom. Jeśli masz jakiekolwiek doświadczenie z reprezentacji DOM XML, należy znaleźć API dość prosta.

Odpowiedział 02/08/2008 o 19:04
źródło użytkownik

głosy
4

Piszę serwera SOAP, który odbiera żądania XML i tworzy odpowiedzi XML. (Niestety, to nie jest mój projekt, więc jest zamknięte źródła, ale to już inny problem).

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

I zachować kopertę, ponieważ koperta odpowiedź jest (prawie) tak samo jak koperty żądania. Następnie, ponieważ moja struktura danych jest (być zagnieżdżone) słownik, utworzyć ciąg, który włącza do tego słownika <key> wartości </ KEY> Produkty.

Jest to zadanie, które sprawia rekurencji prosty, a ja w końcu z prawej struktury. To wszystko odbywa się w kodzie Pythona, a obecnie jest wystarczająco szybki do użytku produkcyjnego.

Można także (stosunkowo) łatwo zbudować listy, a także, choć w zależności od klienta, może trafisz problemów, chyba że dać wskazówki długości.

Dla mnie było to o wiele prostsze, ponieważ słownik jest znacznie łatwiejszy sposób pracy niż jakiejś niestandardowej klasy. Do książek, generowanie XML jest znacznie łatwiejsze niż podczas analizowania!

Odpowiedział 03/08/2008 o 09:34
źródło użytkownik

głosy
3

Osobiście uważam, że rozdział z Zanurkuj w Pythonie jest wielki. Upewnij się, że w pierwszej kolejności - wykorzystuje moduł minidom i jest całkiem dobry kawałek piśmie.

Odpowiedział 11/08/2008 o 19:02
źródło użytkownik

głosy
1

Niedawno zaczął używać Amara z sukcesem.

Odpowiedział 11/08/2008 o 23:40
źródło użytkownik

głosy
5

Istnieją 3 główne sposoby radzenia sobie z XML, ogólnie: dom, sax i XPath. Model ten dom jest dobry, jeśli można sobie pozwolić, aby załadować cały plik XML do pamięci na raz, a nie masz nic do czynienia ze strukturami danych, a ty patrzysz na wiele / większość modelu. Model sax jest wielki, jeśli tylko o kilka tagów, i / lub masz do czynienia z dużymi plikami i może przetwarzać je sekwencyjnie. Model XPath jest trochę od siebie - można wybierać ścieżki do elementów danych potrzebnych, ale wymaga więcej bibliotek w użyciu.

Jeśli chcesz proste i pakowane z Pythonem, minidom jest odpowiedź, ale to dość kulawy, a dokumentacja jest „oto dokumenty na dom, domyśl it out”. To jest naprawdę denerwujące.

Osobiście lubię cElementTree, która jest szybsza (c-based) realizacja ElementTree, który jest podobny do modelu dom.

Użyłem systemy Sax, a pod wieloma względami są one bardziej „pythonic” w ich odczucia, ale zazwyczaj kończy się tworzenie systemów państwowych opiera je obsługiwać, i w ten sposób leży szaleństwo (i błędów).

Mówię iść z minidom jeśli lubisz badania lub ElementTree jeśli chcesz dobrego kodu, który działa dobrze.

Odpowiedział 16/09/2008 o 05:35
źródło użytkownik

głosy
1

Zakładam, że Net-sposobem przetwarzania XML opiera się na'som wersji MSXML i to, że sprawa Zakładam, że stosując na przykład minidom będzie czujesz się trochę jak w domu. Jednakże, jeśli jest to proste przetwarzanie robisz żadnej biblioteki najprawdopodobniej zrobienia.

Ja też preferuje pracę z ElementTree gdy ma do czynienia z XML w Pythonie, jest to bardzo miłe biblioteka.

Odpowiedział 16/09/2008 o 07:20
źródło użytkownik

głosy
5

Użyłem ElementTree dla kilku projektów i polecam go.

To pythonic, przychodzi „w polu” z Pythona 2.5, w tym c wersja cElementTree (xml.etree.cElementTree), który jest 20 razy szybciej niż czysta wersja Pythona, i jest bardzo łatwy w użyciu.

lxml ma pewne zalety Perfomance, ale są nierówne i należy sprawdzić najpierw odniesienia dla przypadku użycia.

Jak rozumiem, kod ElementTree może być łatwo przeniesiony do lxml.

Odpowiedział 23/09/2008 o 20:42
źródło użytkownik

głosy
1

Jeśli masz zamiar być budowanie komunikatów SOAP, sprawdź soaplib . Wykorzystuje ElementTree pod maską, ale zapewnia znacznie czystszy interfejs do szeregowania i deserializacji wiadomości.

Odpowiedział 13/10/2008 o 23:17
źródło użytkownik

głosy
5

To zależy trochę o tym, jak skomplikowany dokument musi być.

Użyłem minidom dużo do pisania XML, ale to zazwyczaj było tylko czytanie dokumentów, dzięki czemu kilka prostych przekształceń i pisanie ich z powrotem na zewnątrz. Że pracował na tyle dobrze, dopóki nie potrzebne możliwość nakazania atrybutów (aby zaspokoić starożytną aplikację, która nie analizuje XML prawidłowo). W tym momencie dałem się i napisał XML siebie.

Jeśli pracujesz tylko na prostych dokumentów, a następnie robi to sam może być szybsze i prostsze niż uczenie ramy. Jeśli można conceivably napisać XML ręcznie, a następnie prawdopodobnie można zakodować go ręcznie, jak również (po prostu pamiętać, aby prawidłowo uciec znaków specjalnych i używać str.encode(codec, errors="xmlcharrefreplace")). Oprócz tych snafus, XML jest na tyle, że nie regularny potrzebują specjalnej biblioteki, aby ją napisać. Jeśli dokument jest zbyt skomplikowany, aby napisać ręcznie, to powinieneś zajrzeć do jednej z ram już wymienionych. W żadnym punkcie nie powinna trzeba napisać ogólny pisarza XML.

Odpowiedział 14/10/2008 o 19:26
źródło użytkownik

głosy
4

Można również spróbować Rozplątać do analizowania prostych dokumentów XML.

Odpowiedział 31/10/2011 o 15:05
źródło użytkownik

głosy
1

Gorąco polecam SAX - Simple API for XML - wdrożenie w bibliotekach Pythona. Są dość łatwe w konfiguracji i przetwarzać duże XML API napędzany przez nawet, jak to omówiono w poprzednich plakaty tutaj, i mają niskie zużycie pamięci w przeciwieństwie do walidacji DOM stylu parsera XML.

Odpowiedział 12/12/2012 o 04:25
źródło użytkownik

głosy
3

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

Python jest wyposażony ElementTree zbudowany w bibliotece, ale lxml rozszerza je pod względem szybkości i funkcjonalności (walidacji schematu, sax parsowania, XPath, różnego rodzaju iteratorów i wiele innych funkcji).

Trzeba go zainstalować, ale w wielu miejscach jest już traktowane jako część standardowego wyposażenia (np Google AppEngine nie pozwala pakietów Pythona C oparte, ale czyni wyjątek dla lxml, pyyaml ​​i kilku innych).

Budowanie dokumentów XML z E-fabryki (od lxml)

Twoje pytanie jest o budowaniu dokumentu XML.

Z lxml istnieje wiele metod i zajęło mi trochę czasu, aby znaleźć taki, który wydaje się być łatwy w użyciu, a także łatwe do odczytania.

Kod próbki z lxml dokumentu na pomocą E-fabryki (nieco uproszczony):


E-fabryka zapewnia 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-fabryki it następujące rzeczy

Kod brzmi prawie tak otrzymanego dokumentu XML

Czytelność liczy.

Umożliwia stworzenie dowolnej zawartości XML

Obsługuje rzeczy jak:

  • Stosowanie nazw
  • rozpoczęcia i zakończenia węzły tekstowe wewnątrz jednego elementu
  • Funkcje formatowania zawartości atrybutu (patrz funkcjono klasy w pełnej próbie lxml )

Umożliwia bardzo czytelne konstrukcje z list

na przykład:

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)

Otrzymany w:

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

wnioski

Gorąco polecam czytanie samouczek lxml - jest bardzo dobrze napisana i daje o wiele więcej powodów, by używać tę potężną bibliotekę.

Jedyną wadą lxml jest, że musi być skompilowany. Zobacz SO odpowiedzieć więcej porad jak zainstalować lxml z pakietem formatu koła w ciągu ułamka sekundy.

Odpowiedział 17/04/2014 o 22:32
źródło użytkownik

głosy
1

Myślę, że należy użyć do tego funkcjonalność lxml

Odpowiedział 08/10/2014 o 06:58
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more