with - title of graph python




XML-Verarbeitung in Python (8)

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

Python wird mit der in ElementTree integrierten Bibliothek ausgeliefert, aber lxml erweitert es in Bezug auf Geschwindigkeit und Funktionalität (Schemaüberprüfung, Sax-Parsing, 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. erlaubt Google AppEngine keine C-basierten Python-Pakete, macht jedoch eine Ausnahme für lxml, pyyaml ​​und einige andere).

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

Ihre Frage bezieht sich auf das Erstellen von XML-Dokumenten.

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

Beispielcode aus lxml doc 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 bei E-Factory folgende Dinge

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 zur Formatierung des Attributinhalts (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 Wheel-Format-Paket in Sekundenbruchteilen finden Sie unter SO answer .

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

Obwohl ich das XML-Modell in .NET ziemlich gut kenne, bin ich mir 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, werden ziemlich einfach sein.


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 recht einfach finden.


Ich empfehle dringend die SAX - Simple API for XML - Implementierung in den Python - Bibliotheken. Sie sind relativ einfach zu konfigurieren und verarbeiten große XML Daten API selbst gesteuerten API , wie in den vorherigen Postern beschrieben, und haben einen geringen Speicherbedarf im Gegensatz zur Überprüfung von XML Parsern im DOM Stil.


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 der Verwendung von beispielsweise minidom ein wenig wie zu Hause fühlen würden. Wenn es sich jedoch um eine einfache Verarbeitung handelt, werden Sie wahrscheinlich eine Bibliothek verwenden.

Ich bevorzuge es auch, mit ElementTree zu arbeiten, wenn ich mit XML in Python arbeite. Es ist eine sehr ordentliche Bibliothek.


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 anderes 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) dem Anforderungsumschlag entspricht. Da es sich bei meiner Datenstruktur um ein (möglicherweise verschachteltes) Wörterbuch handelt, erstelle ich eine Zeichenfolge, mit der dieses Wörterbuch in <key> value </ key> -Elemente umgewandelt wird.

Dies ist eine Aufgabe, die Rekursion einfach macht, und am Ende habe ich die richtige Struktur. Dies geschieht alles in Python-Code und ist derzeit schnell genug für den produktiven Einsatz.

Sie können auch (relativ) leicht Listen erstellen, obwohl Sie abhängig von Ihrem Client möglicherweise auf Probleme stoßen, es sei denn, Sie geben Längenhinweise.

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


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, und es Ihnen nichts ausmacht, mit Datenstrukturen umzugehen, und Sie sich einen Großteil des Modells ansehen. Das Saxophon-Modell eignet sich hervorragend, 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 kleiner Teil von jedem - Sie können Pfade zu den Datenelementen auswählen, die Sie benötigen, aber es sind mehr Bibliotheken erforderlich, um sie zu verwenden.

Wenn Sie einfach 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, finde 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 sie fühlen sich in vielerlei Hinsicht "pythonischer" an, aber normalerweise erstelle ich zustandsbasierte Systeme, um mit ihnen umzugehen, und auf diese Weise liegt der Wahnsinn (und die Fehler).

Ich sage, geh mit minidom, wenn du Nachforschungen magst, oder ElementTree, wenn du guten Code willst, der gut funktioniert.


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


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





xml