XML-Verarbeitung in Python

Translate

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.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

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

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 ich mag: Sie können das Parsen in einemforSchleife anstatt Rückrufe zu verwenden. Sie verzögern auch das vollständige Parsen (der "Pull" -Teil) und erhalten zusätzliche Details nur, wenn Sie anrufenexpandNode(). Dies erfüllt meine allgemeine Anforderung nach "verantwortungsbewusster" Effizienz, ohne die Benutzerfreundlichkeit und Einfachheit zu beeinträchtigen.

Quelle
Translate

ElementTreehat 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 schön, aber wenn Sie am Ende mehr Leistung brauchen, dannlxmlmacht dieselbe API verfügbar und verwendet libxml2 unter der Haube. Sie können es theoretisch einfach austauschen, wenn Sie feststellen, dass Sie es benötigen.

Quelle
Translate

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 sich einen Großteil des Modells ansehen. 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 sind mehr Bibliotheken erforderlich.

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 der Wahnsinn (und die Fehler).

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

Quelle
Myron Lee
Translate

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
Translate

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 verwendenstr.encode(codec, errors="xmlcharrefreplace")). Abgesehen von diesen Snafus ist XML regelmäßig genug, dass Sie dies nicht tunbraucheneine spezielle Bibliothek, 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.

Quelle
Translate

Sie können es auch versuchenentwirreneinfache XML-Dokumente zu analysieren.

Quelle
Translate

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

Quelle
Translate

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!

Quelle
Translate

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 vonlxml-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 invollständige lxml Probe)

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. SehenAlso antworte für weitere TippsSo installieren Sie lxml innerhalb eines Sekundenbruchteils aus dem Radformatpaket.

Quelle
Translate

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

Quelle
Translate

Ich empfehle dringendSAX - Simple API for XML- Implementierung in den Python-Bibliotheken. Sie sind ziemlich einfach einzurichten und groß zu verarbeitenXMLvon sogar gefahrenAPI, wie in früheren Postern hier beschrieben, und haben im Gegensatz zur Validierung einen geringen SpeicherbedarfDOMStilXMLParser.

Quelle
Translate

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 mit Minidom wie zu Hause fühlen würden. Wenn es sich jedoch um eine einfache Verarbeitung handelt, reicht wahrscheinlich eine Bibliothek aus.

Ich arbeite auch lieber mit ElementTree, wenn ich mit XML in Python arbeite. Es ist eine sehr ordentliche Bibliothek.

Quelle