XML-Verarbeitung in Python [geschlossen]

75

Ich bin dabei, ein Teil eines Projekts zu erstellen, das ein XML-Dokument erstellen und in einem Webdienst veröffentlichen muss, und ich möchte es in Python ausführen, um meine Fähigkeiten darin zu erweitern.

Obwohl ich das XML-Modell in .NET ziemlich gut kenne, bin ich mir leider nicht sicher, welche Vor- und Nachteile die XML-Modelle in Python haben.

Hat jemand Erfahrung mit der XML-Verarbeitung in Python? Wo würdest du vorschlagen, dass ich anfange? Die XML-Dateien, die ich erstellen werde, sind ziemlich einfach.

Saalon
quelle
Dive Into Python hat ein Kapitel. Ich kann nicht dafür bürgen, wie gut es wäre.
Bernard
4
Erste Python- Frage
Roshan

Antworten:

29

Persönlich habe ich mit mehreren der integrierten Optionen eines XML-lastigen Projekts gespielt und mich für Pulldom als beste Wahl für weniger komplexe Dokumente entschieden.

Besonders für kleine einfache Dinge mag ich die ereignisgesteuerte Theorie des Parsens, anstatt eine ganze Reihe von Rückrufen für eine relativ einfache Struktur einzurichten. Hier finden Sie eine kurze Beschreibung der Verwendung der API .

Was mir gefällt: Sie können das Parsen in einer forSchleife durchführen, anstatt Rückrufe zu verwenden. Sie verzögern auch das vollständige Parsen (der "Pull" -Teil) und erhalten zusätzliche Details nur, wenn Sie anrufen expandNode(). Dies erfüllt meine allgemeine Anforderung nach "verantwortungsbewusster" Effizienz, ohne die Benutzerfreundlichkeit und Einfachheit zu beeinträchtigen.

saint_groceon
quelle
Ist Pulldom nicht ein Tool zum Parsen von XML, nicht zum Generieren von XML (worum geht es in der Frage)?
Cunkel
31

ElementTree hat eine schöne Python-API. Ich denke, es wird sogar als Teil von Python 2.5 ausgeliefert

Es ist in reinem Python und wie gesagt ziemlich nett, aber wenn Sie mehr Leistung benötigen, stellt lxml dieselbe API zur Verfügung und verwendet libxml2 unter der Haube. Sie können es theoretisch einfach austauschen, wenn Sie feststellen, dass Sie es benötigen.

Gareth Simpson
quelle
1
Können Sie hinzufügen, dass lxml auch XML-Schema und XPath unterstützt, was von ElementTree nicht unterstützt wird, um Ihre Antwort zu vervollständigen? Und es wird tatsächlich mit Python 2.5 ausgeliefert.
Torsten Marek
2
ElementTree ist gut, bis Sie sich mit Namespaces befassen müssen. Dann fällt es auseinander und ist unbrauchbar.
Ryu
6

Es gibt im Allgemeinen drei Hauptmethoden für den Umgang mit XML: dom, sax und xpath. Das dom-Modell ist gut, wenn Sie es sich leisten können, Ihre gesamte XML-Datei auf einmal in den Speicher zu laden, und es Ihnen nichts ausmacht, mit Datenstrukturen umzugehen, und Sie einen Großteil des Modells betrachten. Das Saxophonmodell ist großartig, wenn Sie sich nur um wenige Tags kümmern und / oder wenn Sie mit großen Dateien arbeiten und diese nacheinander verarbeiten können. Das xpath-Modell ist ein kleines Stück von jedem - Sie können Pfade zu den Datenelementen auswählen, die Sie benötigen, aber es erfordert mehr Bibliotheken, um verwendet zu werden.

Wenn Sie unkompliziert und mit Python verpackt sein möchten, ist Minidom Ihre Antwort, aber es ist ziemlich lahm, und die Dokumentation lautet "Hier sind die Dokumente zu Dom, finden Sie es heraus". Es ist wirklich nervig.

Persönlich mag ich cElementTree, eine schnellere (c-basierte) Implementierung von ElementTree, einem dom-ähnlichen Modell.

Ich habe Saxophonsysteme verwendet und in vielerlei Hinsicht fühlen sie sich "pythonischer" an, aber normalerweise erstelle ich staatsbasierte Systeme, um damit umzugehen, und auf diese Weise liegt Wahnsinn (und Fehler).

Ich sage, gehen Sie mit Minidom, wenn Sie gerne recherchieren, oder mit ElementTree, wenn Sie guten Code wollen, der gut funktioniert.

Kent Quirk
quelle
In Python gibt es andere Möglichkeiten, wie ElementTree (siehe Gareth Simpsons Antwort)
Bortzmeyer
6

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

Es ist pythonisch und wird mit Python 2.5 geliefert, einschließlich der c-Version cElementTree (xml.etree.cElementTree), die 20-mal schneller als die reine Python-Version ist und sehr einfach zu verwenden ist.

lxml hat einige Leistungsvorteile, aber sie sind ungleichmäßig und Sie sollten zuerst die Benchmarks für Ihren Anwendungsfall überprüfen.

So wie ich es verstehe, kann ElementTree-Code leicht nach lxml portiert werden.


quelle
6

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

Ich habe Minidom häufig zum Schreiben von XML verwendet, aber normalerweise wurden nur Dokumente gelesen, einige einfache Transformationen vorgenommen und wieder ausgeschrieben. Das funktionierte gut genug, bis ich die Möglichkeit brauchte, Elementattribute zu ordnen (um eine alte Anwendung zu befriedigen, die XML nicht richtig analysiert). Zu diesem Zeitpunkt gab ich auf und schrieb das XML selbst.

Wenn Sie nur an einfachen Dokumenten arbeiten, kann dies schneller und einfacher sein als das Erlernen eines Frameworks. Wenn Sie das XML möglicherweise von Hand schreiben können, können Sie es wahrscheinlich auch von Hand codieren (denken Sie daran, Sonderzeichen ordnungsgemäß zu umgehen und zu verwenden str.encode(codec, errors="xmlcharrefreplace")). Abgesehen von diesen Snafus ist XML regelmäßig genug, dass Sie keine spezielle Bibliothek benötigen , um es zu schreiben. Wenn das Dokument zu kompliziert ist, um von Hand geschrieben zu werden, sollten Sie sich wahrscheinlich eines der bereits erwähnten Frameworks ansehen. Sie sollten zu keinem Zeitpunkt einen allgemeinen XML-Writer schreiben müssen.

vergoldet
quelle
5

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

Jabba
quelle
4

Da Sie erwähnt haben, dass Sie "ziemlich einfaches" XML erstellen , wird das Minidom-Modul (Teil der Python-Standardbibliothek) wahrscheinlich Ihren Anforderungen entsprechen. Wenn Sie Erfahrung mit der DOM-Darstellung von XML haben, sollten Sie die API ganz einfach finden.

Matt
quelle
4

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

Es stellte sich für mich heraus, dass das Erstellen von (SOAP) XML-Dokumenten ziemlich einfach ist, wenn Sie eine Datenstruktur haben, die zum Schema "passt".

Ich behalte den Umschlag, da der Antwortumschlag (fast) mit dem Anforderungsumschlag übereinstimmt. Da meine Datenstruktur ein (möglicherweise verschachteltes) Wörterbuch ist, erstelle ich eine Zeichenfolge, die dieses Wörterbuch in <key> value </ key> -Elemente umwandelt.

Dies ist eine Aufgabe, die durch Rekursion einfach wird, und ich habe die richtige Struktur. Dies alles geschieht in Python-Code und ist derzeit schnell genug für die Produktion.

Sie können auch (relativ) einfach Listen erstellen, obwohl Sie je nach Client auf Probleme stoßen können, wenn Sie keine Längenangaben machen.

Für mich war dies viel einfacher, da ein Wörterbuch eine viel einfachere Arbeitsweise ist als eine benutzerdefinierte Klasse. Für die Bücher ist das Generieren von XML viel einfacher als das Parsen!

Matthew Schinckel
quelle
3

Verwenden Sie für ernsthafte Arbeiten mit XML in Python lxml

Python verfügt über eine integrierte ElementTree-Bibliothek, die jedoch von lxml in Bezug auf Geschwindigkeit und Funktionalität erweitert wird (Schemaüberprüfung, Saxophonanalyse, XPath, verschiedene Arten von Iteratoren und viele andere Funktionen).

Sie müssen es installieren, aber an vielen Stellen wird bereits davon ausgegangen, dass es Teil der Standardausrüstung ist (z. B. lässt Google AppEngine keine C-basierten Python-Pakete zu, macht jedoch eine Ausnahme für lxml, pyyaml ​​und einige andere).

Erstellen von XML-Dokumenten mit E-Factory (von lxml)

Ihre Frage bezieht sich auf das Erstellen eines XML-Dokuments.

Mit lxml gibt es viele Methoden und ich habe eine Weile gebraucht, um die zu finden, die einfach zu bedienen und auch leicht zu lesen zu sein scheint.

Beispielcode aus dem lxml-Dokument zur Verwendung von E-Factory (leicht vereinfacht):


Die E-Factory bietet eine einfache und kompakte Syntax zum Generieren von XML und 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>

Ich schätze es auf E-Factory folgenden Dingen

Code liest sich fast wie das resultierende XML-Dokument

Lesbarkeit zählt.

Ermöglicht die Erstellung von XML-Inhalten

Unterstützt Dinge wie:

  • Verwendung von Namespaces
  • Textknoten innerhalb eines Elements starten und beenden
  • Funktionen zum Formatieren von Attributinhalten (siehe func CLASS im vollständigen lxml-Beispiel )

Ermöglicht gut 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 dringend, das lxml-Tutorial zu lesen - es ist sehr gut geschrieben und gibt Ihnen viele weitere Gründe, diese leistungsstarke Bibliothek zu verwenden.

Der einzige Nachteil von lxml ist, dass es kompiliert werden muss. Weitere Tipps zum Installieren von lxml aus dem Radformatpaket innerhalb von Sekundenbruchteilen finden Sie in der SO-Antwort .

Jan Vlcinsky
quelle
1

Wenn Sie SOAP-Nachrichten erstellen möchten , lesen Sie soaplib . Es verwendet ElementTree unter der Haube, bietet jedoch eine viel übersichtlichere Oberfläche zum Serialisieren und Deserialisieren von Nachrichten.

William McVey
quelle
1

Ich empfehle dringend SAX - Simple API for XML- Implementierung in den Python-Bibliotheken. Sie sind ziemlich einfach einzurichten und zu großen Prozess XMLvon selbst angetrieben API, wie hier von früheren Plakaten diskutiert und haben einen geringen Speicherbedarf im Gegensatz zu validieren DOMStil XMLParser.

Arcturus
quelle
1

Ich gehe davon aus, dass die .NET-Methode zur Verarbeitung von XML auf einer Version von MSXML aufbaut, und in diesem Fall gehe ich davon aus, dass Sie sich bei Verwendung von beispielsweise Minidom wie zu Hause fühlen würden. Wenn es sich jedoch um eine einfache Verarbeitung handelt, wird wahrscheinlich jede Bibliothek dies tun.

Ich arbeite auch lieber mit ElementTree, wenn ich mit XML in Python arbeite, da es sich um eine sehr übersichtliche Bibliothek handelt.

mbesso
quelle