XML-Verarbeitung in Python

stimmen
61

Ich bin über ein Stück eines Projekt zu erstellen, die ein XML-Dokument an einen Webdienst müssen konstruieren und posten und ich möchte es in Python tun, als ein Mittel, meine Fähigkeiten in ihnen zu erweitern.

Leider während ich das XML-Modell ziemlich gut in .NET weiß, ich bin unsicher, was die Vor- und Nachteile der XML-Modelle in Python sind.

Jemand Erfahrung tut XML-Verarbeitung in Python? Wo würden Sie vorschlagen, ich anfangen? Die XML-Dateien Ich werden bauen würde ziemlich einfach sein.

Veröffentlicht am 02/08/2008 um 04:35
quelle vom benutzer
In anderen Sprachen...                            


16 antworten

stimmen
30

ElementTree hat ein schönes pythony API. Ich denke , es ist auch als Teil der Python ausgeliefert ist 2.5

Es ist in reinem Python und wie gesagt, sehr schön, aber wenn Sie mehr Leistung aufzuwickeln benötigen, dann lxml macht die gleiche API und verwendet libxml2 unter der Haube. Sie können theoretisch tauschen es nur in , wenn Sie entdecken Sie es brauchen.

Beantwortet am 02/08/2008 um 16:21
quelle vom benutzer

stimmen
22

Persönlich habe ich mit einigen der eingebauten Optionen auf einem XML-schweren Projekt gespielt und haben auf abgewickelte pulldom als die beste Wahl für weniger komplexe Dokumente.

Speziell für kleine einfache Sachen, ich mag die ereignisgesteuerte Theorie der Parsen , anstatt eine ganze Reihe von Rückrufen für eine relativ einfache Struktur aufzubauen. Hier ist eine gute schnelle Diskussion darüber , wie die API zu verwenden .

Was Ich mag: Sie können die Analyse in einer hand forSchleife anstatt Rückrufe verwenden. Sie verzögern auch vollständige Analyse (der „Pull“ Teil) und nur ein zusätzliches Detail bekommen , wenn Sie anrufen expandNode(). Dies erfüllt meine allgemeine Anforderung für „verantwortlich“ Effizienz ohne Benutzerfreundlichkeit und Einfachheit zu opfern.

Beantwortet am 02/08/2008 um 05:01
quelle vom benutzer

stimmen
6

Dive Into Python hat ein Kapitel. Kann nicht bürgen dafür , wie gut es allerdings sein würde.

Beantwortet am 02/08/2008 um 04:43
quelle vom benutzer

stimmen
5

Es hängt ein wenig auf, wie kompliziert das Dokument sein muss.

Ich habe für das Schreiben von XML minidom viel verwendet, aber das ist in der Regel nur das Lesen von Dokumenten gewesen, einige einfache Transformationen zu machen und sie wieder heraus zu schreiben. Das funktionierte gut genug, bis ich die Fähigkeit benötigen Elementattribute zu bestellen (eine alte Anwendung zu erfüllen, die nicht XML richtig funktioniert parsen). An diesem Punkt gab ich auf und schrieb die XML selbst.

Wenn Sie sich nur auf einfachen Dokumenten arbeiten, es zu tun , dann können Sie sich sein schneller und einfacher als einen Rahmen zu lernen. Wenn Sie möglicherweise die XML von Hand schreiben können, dann können Sie wahrscheinlich es von Hand - Code als auch (nur nicht vergessen , um richtig Sonderzeichen zu entkommen, und verwenden str.encode(codec, errors="xmlcharrefreplace")). Neben diesem snafus, XML ist regelmäßig genug , dass Sie nicht brauchen eine spezielle Bibliothek zu schreiben. Wenn das Dokument zu kompliziert ist von Hand zu schreiben, dann sollten Sie vielleicht schauen in einen der Rahmen bereits erwähnt. Zu keinem Zeitpunkt sollten Sie benötigen einen allgemeinen XML - Writer zu schreiben.

Beantwortet am 14/10/2008 um 19:26
quelle vom benutzer

stimmen
5

Ich habe ElementTree für mehrere Projekte verwendet und empfehlen es.

Es ist pythonic, kommt ‚in der Box‘ mit Python 2.5, einschließlich der c-Version celementtree (xml.etree.cElementTree), die 20-mal schneller als die reine Python-Version ist, und ist sehr einfach zu bedienen.

lxml hat einige perfomance Vorteile, aber sie sind unebene und Sie sollten die Benchmarks zunächst für Ihren Anwendungsfall überprüfen.

Wie ich es verstehe, kann ElementTree Code leicht portiert werden lxml.

Beantwortet am 23/09/2008 um 20:42
quelle vom benutzer

stimmen
5

Es gibt drei große Möglichkeiten von XML zu tun, im Allgemeinen: dom, Saxophon und XPath. Das dom Modell ist gut, wenn Sie es sich leisten können Ihre gesamte XML-Datei in den Speicher auf einmal zu laden, und es Ihnen nichts ausmacht mit Datenstrukturen zu tun, und Sie sind auf viel / die meisten des Modells. Das Saxophon Modell ist groß, wenn Sie nur über ein paar Tags kümmern, und / oder Sie sind der Umgang mit großen Dateien und kann sie nacheinander verarbeiten. Das XPath-Modell ist ein wenig von jedem - Sie Pfade zu den Datenelementen wählen, und wählen Sie brauchen, aber es erfordert mehr Bibliotheken zu verwenden.

Wenn Sie mit Python einfach und verpackt wollen, minidom ist deine Antwort, aber es ist ziemlich lahm, und die Dokumentation ist „hier ist docs auf dom, geht es herauszufinden“. Es ist wirklich nervig.

Ich persönlich mag celementtree, das ist eine schnelle (c-basierte) Implementierung von ElementTree, die ein dom-ähnlichen Modell ist.

Ich habe sax-Systeme verwendet werden, und in vielerlei Hinsicht sind sie mehr „pythonic“ in ihrem Gefühl, aber ich in der Regel zustandsbasierte Systeme, sie zu handhaben am Ende zu schaffen und auf diese Weise liegt Wahnsinn (und Bugs).

Ich sage mit minidom gehen, wenn Sie Forschung mögen, oder ElementTree wenn Sie gute Code wollen, die gut funktioniert.

Beantwortet am 16/09/2008 um 05:35
quelle vom benutzer

stimmen
4

Sie können auch versuchen entwirren einfache XML - Dokumente zu analysieren.

Beantwortet am 31/10/2011 um 15:05
quelle vom benutzer

stimmen
4

Ich schreibe einen SOAP-Server, XML-Anforderungen empfängt, und erzeugt XML-Antworten. (Leider ist es nicht mein Projekt, so ist es Closed-Source, aber das ist ein anderes Problem).

Es stellte sich für mich heraus, dass (SOAP) von XML-Dokumenten zu schaffen ist ziemlich einfach, wenn Sie eine Datenstruktur haben, dass „passt“ das Schema.

Ich halte den Umschlag, da die Antwort Umschlag (fast) die gleichen wie die Anforderung Umschlag ist. Dann wird, da meine Datenstruktur ein (möglicherweise verschachtelter) Wörterbuch ist, erstelle ich eine Zeichenfolge, die dieses Wörterbuch in <key> Wert </ key> drehen Artikel.

Dies ist eine Aufgabe, die Rekursion einfach macht, und ich mit der richtigen Struktur enden. Dies alles wird in Python-Code getan, und ist derzeit schnell genug für den produktiven Einsatz.

Sie können auch (relativ) leicht Listen bauen auch, obwohl in Abhängigkeit von Ihrem Client, können Probleme treffen, wenn Sie Länge Hinweise geben.

Für mich war das viel einfacher, da ein Wörterbuch eine viel einfachere Art und Weise zu arbeiten als einige benutzerdefinierte Klasse. Für die Bücher, Generierung von XML ist viel einfacher als das Parsen!

Beantwortet am 03/08/2008 um 09:34
quelle vom benutzer

stimmen
3

Für ernsthafte Arbeit mit XML in Python Verwendung lxml

Python kommt mit ElementTree in der Bibliothek gebaut, aber lxml erstreckt sie sich in Bezug auf Geschwindigkeit und Funktionalität (Schema-Validierung, sax Parsing, XPath, verschiedene Arten von Iteratoren und viele andere Eigenschaften).

Sie haben es zu installieren, aber an vielen Orten ist es bereits angenommen Teil der Standardausrüstung (zB Google App Engine nicht C-basierten Python-Pakete ermöglichen, sondern macht Ausnahme für lxml, pyyaml ​​und einige andere).

Der Aufbau von XML-Dokumenten mit E-Werk (von lxml)

Ihre Frage ist über XML-Dokument zu bauen.

Mit lxml gibt es viele Methoden, und es dauerte eine Weile, um das zu finden, die einfach zu bedienen und auch einfach zu sein scheint, zu lesen.

Beispielcode aus lxml doc zur Verwendung von E-Werk (etwas vereinfacht):


Das E-Werk bietet eine einfache und kompakte Syntax für XML und HTML zu erzeugen:

>>> 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>

Ich schätze auf E-Werk es folgende Dinge

Code liest sich fast wie das resultierende XML-Dokument

Lesbarkeit zählt.

Ermöglicht die Erstellung eines XML-Inhalte

Unterstützt Sachen wie:

  • Verwendung von Namensräumen
  • Beginn und Ende des Textknoten innerhalb eines Elements
  • Funktionen Formatierung Attributinhalt (func CLASS live in voller lxml Probe )

Ermöglicht sehr lesbare Konstrukte mit Listen

z.B:

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)

ergebend:

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

Schlussfolgerungen

Ich empfehle das Lesen lxml Tutorial hoch - es ist sehr gut geschrieben und gibt Ihnen viele weitere Gründe, diese leistungsfähige Bibliothek.

Der einzige Nachteil von lxml ist, dass es kompiliert werden müssen. Siehe SO für weitere Tipps zu beantworten , wie lxml von Rad - Format Paket innerhalb von Sekundenbruchteil installieren.

Beantwortet am 17/04/2014 um 22:32
quelle vom benutzer

stimmen
3

Ich persönlich denke , dass Kapitel aus Tauchen Sie ein in Python ist groß. Überprüfen Sie, dass aus erster - den minidom Modul verwendet und ist ein ziemlich gutes Stück zu schreiben.

Beantwortet am 11/08/2008 um 19:02
quelle vom benutzer

stimmen
3

Da Sie erwähnen , dass Sie „ziemlich einfach“ XML, das würden den Aufbau minidom Modul (Teil des Python Standard Library) wird Ihre Bedürfnisse wahrscheinlich passen. Wenn Sie keine Erfahrung mit der DOM - Darstellung von XML haben, sollten Sie die API ganz gerade nach vorne finden.

Beantwortet am 02/08/2008 um 19:04
quelle vom benutzer

stimmen
1

Ich denke, dass Sie für diese functionallity verwenden lxml sollte

Beantwortet am 08/10/2014 um 06:58
quelle vom benutzer

stimmen
1

Ich empfehle SAX - Simple API für XML - Implementierung in den Python-Bibliotheken. Sie sind ziemlich einfach zu installieren und zu verarbeiten große XML von selbst angetrieben API, wie hier von früheren Plakaten diskutiert und haben einen geringen Speicherbedarf im Gegensatz zu validieren DOM Stil XML-Parser.

Beantwortet am 12/12/2012 um 04:25
quelle vom benutzer

stimmen
1

Wenn Sie vorhaben , SOAP - Nachrichten zu bauen Besuche soaplib . Es verwendet ElementTree unter der Haube, aber es bietet eine viel saubere Schnittstelle für die Serialisierung und Deserialisierung Nachrichten.

Beantwortet am 13/10/2008 um 23:17
quelle vom benutzer

stimmen
1

Ich gehe davon aus, dass die .NET-Wege-XML-Verarbeitung auf'som Version von MSXML baut und dass Fall Ich gehe davon aus, dass zum Beispiel minidom verwenden würden Sie etwas wie zu Hause fühlen. Aber wenn es sich um einfache Verarbeitung Sie jede Bibliothek tun wird wahrscheinlich tun.

Ich auch lieber mit ElementTree arbeiten, wenn sie mit xml in Python zu tun, ist es eine sehr ordentliche Bibliothek.

Beantwortet am 16/09/2008 um 07:20
quelle vom benutzer

stimmen
1

Ich begann vor kurzem Amara mit Erfolg verwendet.

Beantwortet am 11/08/2008 um 23:40
quelle vom benutzer

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