Frage

Ich bin dabei, einen Teil eines Projekts zu erstellen, bei dem ein XML-Dokument erstellt und an einen Webdienst gesendet werden muss, und ich möchte dies in Python tun, um meine Kenntnisse darin zu erweitern.

Obwohl ich das XML-Modell in .NET recht 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ürde ich Ihrer Meinung nach anfangen?Die XML-Dateien, die ich erstellen werde, werden ziemlich einfach sein.

War es hilfreich?

Lösung

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

Besonders bei kleinen, einfachen Dingen gefällt mir die ereignisgesteuerte Parsing-Theorie, anstatt eine ganze Reihe von Rückrufen für eine relativ einfache Struktur einzurichten. Hier finden Sie eine kurze kurze Erläuterung zur Verwendung der API.

Was ich mag:Sie können das Parsen in einem erledigen for Schleife anstatt Rückrufe zu verwenden.Außerdem verzögern Sie die vollständige Analyse (den „Pull“-Teil) und erhalten zusätzliche Details erst, wenn Sie anrufen expandNode().Dies erfüllt meine allgemeine Forderung nach „verantwortungsvoller“ Effizienz, ohne auf Benutzerfreundlichkeit und Einfachheit zu verzichten.

Andere Tipps

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

Es ist in reinem Python und, wie ich schon sagte, ziemlich nett, aber wenn Sie am Ende mehr Leistung benötigen, dann lxml stellt die gleiche API bereit und verwendet unter der Haube libxml2.Theoretisch können Sie es einfach austauschen, wenn Sie feststellen, dass Sie es brauchen.

Im Allgemeinen gibt es 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, Ihnen der Umgang mit Datenstrukturen nichts ausmacht und Sie sich einen Großteil bzw. den größten Teil des Modells ansehen.Das Sax-Modell ist großartig, wenn Sie sich nur um ein paar Tags kümmern und/oder mit großen Dateien arbeiten und diese nacheinander verarbeiten können.Das xpath-Modell ist ein kleiner Teil von beidem – Sie können Pfade zu den Datenelementen auswählen, die Sie benötigen, aber es erfordert mehr Bibliotheken zur Verwendung.

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 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 Saxofon-Systeme verwendet, und in vielerlei Hinsicht sind sie eher „pythonisch“, aber am Ende erstelle ich normalerweise zustandsbasierte Systeme, um damit umzugehen, und das ist der Wahnsinn (und die Fehler).

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

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

Es ist pythonisch, 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, diese sind jedoch ungleichmäßig und Sie sollten zuerst die Benchmarks für Ihren Anwendungsfall überprüfen.

Soweit ich weiß, kann ElementTree-Code problemlos nach lxml portiert werden.

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

Ich habe Minidom häufig zum Schreiben von XML verwendet, aber dabei ging es normalerweise nur darum, Dokumente zu lesen, einige einfache Transformationen vorzunehmen und sie wieder auszuschreiben.Das funktionierte gut genug, bis ich die Möglichkeit brauchte, Elementattribute zu ordnen (um einer alten Anwendung gerecht zu werden, die XML nicht richtig analysiert).An diesem Punkt gab ich auf und schrieb das XML selbst.

Wenn Sie nur an einfachen Dokumenten arbeiten, kann es schneller und einfacher sein, dies selbst zu tun, als ein Framework zu erlernen.Wenn Sie das XML möglicherweise von Hand schreiben können, können Sie es wahrscheinlich auch von Hand codieren (denken Sie nur daran, Sonderzeichen richtig zu maskieren und zu verwenden). str.encode(codec, errors="xmlcharrefreplace")).Abgesehen von diesen Fehlern ist XML so regelmäßig, dass Sie es nicht tun brauchen eine spezielle Bibliothek, um es zu schreiben.Wenn das Dokument zu kompliziert ist, um es von Hand zu schreiben, sollten Sie sich wahrscheinlich eines der bereits erwähnten Frameworks ansehen.Zu keinem Zeitpunkt sollten Sie einen allgemeinen XML-Writer schreiben müssen.

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

Da Sie erwähnt haben, dass Sie „ziemlich einfaches“ XML erstellen werden, ist das Minidom-Modul (Teil der Python-Standardbibliothek) wird wahrscheinlich Ihren Anforderungen entsprechen.Wenn Sie Erfahrung mit der DOM-Darstellung von XML haben, dürfte Ihnen die API recht einfach vorkommen.

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

Für mich stellte sich heraus, dass das Erstellen von (SOAP-)XML-Dokumenten ziemlich einfach ist, wenn man eine Datenstruktur hat, die zum Schema „passt“.

Ich behalte den Umschlag, da der Antwortumschlag (fast) derselbe ist wie der Anfrageumschlag.Da meine Datenstruktur dann 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 vereinfacht wird, und am Ende erhalte ich die richtige Struktur.Dies geschieht alles im Python-Code und ist derzeit schnell genug für den Produktionseinsatz.

Sie können auch (relativ) einfach Listen erstellen, obwohl es je nach Kunde möglicherweise auf Probleme stoßen kann, wenn Sie keine Hinweise zur Länge geben.

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

Für ernsthafte Arbeit mit XML in Python verwenden Sie lxml

Python verfügt über eine integrierte ElementTree-Bibliothek, lxml erweitert diese jedoch in Bezug auf Geschwindigkeit und Funktionalität (Schemavalidierung, Sax-Parsing, XPath, verschiedene Arten von Iteratoren und viele andere Funktionen).

Man muss es installieren, aber vielerorts wird davon ausgegangen, dass es bereits zur Standardausrüstung gehört (z. B.Google AppEngine erlaubt keine C-basierten Python-Pakete, macht jedoch eine Ausnahme für lxml, pyyaml ​​und einige andere.

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

Ihre Frage betrifft das Erstellen eines XML-Dokuments.

Bei lxml gibt es viele Methoden und es hat eine Weile gedauert, bis ich die gefunden habe, die einfach zu verwenden und auch leicht zu lesen zu sein scheint.

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


Die E-Factory bietet eine einfache und kompakte Syntax zur Generierung 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 die folgenden Dinge bei E-Factory

Der Code liest sich fast wie das resultierende XML-Dokument

Lesbarkeit zählt.

Ermöglicht die Erstellung beliebiger XML-Inhalte

Unterstützt Dinge wie:

  • Verwendung von Namensräumen
  • Start- und Endtextknoten innerhalb eines Elements
  • Funktionen zum Formatieren von Attributinhalten (siehe func CLASS in vollständiges lxml-Beispiel)

Ermöglicht sehr 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 wird Ihnen viele weitere Gründe nennen, diese leistungsstarke Bibliothek zu verwenden.

Der einzige Nachteil von lxml ist, dass es kompiliert werden muss.Sehen Also antworten Sie für weitere Tipps So installieren Sie lxml aus dem Wheel-Format-Paket innerhalb eines Sekundenbruchteils.

Wenn Sie SOAP-Nachrichten erstellen möchten, schauen Sie sich das an Soaplib.Unter der Haube nutzt es ElementTree, bietet jedoch eine viel übersichtlichere Schnittstelle zum Serialisieren und Deserialisieren von Nachrichten.

Ich empfehle dringend SAX - Simple API for XML - Implementierung in den Python-Bibliotheken.Sie sind relativ einfach einzurichten und groß zu verarbeiten XML von selbst gefahren API, wie von früheren Postern hier besprochen, und haben im Gegensatz zur Validierung einen geringen Speicherbedarf DOM Stil XML Parser.

Ich gehe davon aus, dass die .Net-Methode der XML-Verarbeitung auf einer Version von MSXML aufbaut, und in diesem Fall gehe ich davon aus, dass Sie sich mit der Verwendung von beispielsweise Minidom einigermaßen zu Hause fühlen würden.Wenn es sich jedoch um eine einfache Verarbeitung handelt, reicht wahrscheinlich jede Bibliothek aus.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top