Adblock deaktivieren

Adblock blockiert einige Inhalte auf der Website

ADBlock errore

Frage

Ich bin über ein Stück eines Projekt zu erstellen, die ein XML-Dokument an einen Webdienst erstellen und veröffentlichen müssen, 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.

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

Lösung

Persönlich habe ich mit einigen der eingebauten Optionen auf einem XML-schweren Projekt gespielt und habe auf 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 verwenden.

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

Andere Tipps

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

versendet hat

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.

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 können Pfade zu den Datenelementen Sie müssen wählen, und wählen, aber es mehr Bibliotheken erfordert die Verwendung

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 ärgerlich.

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

Ich habe sax-Systemen verwendet, 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 gehen mit minidom wenn Sie wie Forschung oder ElementTree, wenn Sie gute Code wollen, die gut funktioniert.

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 einige perfomance Vorteile hat, 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.

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 nur auf einfachen Dokumenten arbeiten, dann ist es selbst tun kann 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 Sie str.encode(codec, errors="xmlcharrefreplace")). Neben diesem snafus, XML ist regelmäßig genug, dass Sie nicht Notwendigkeit 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.

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

Da Sie erwähnen, dass Sie bauen „ziemlich einfach“ XML, die 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.

Ich schreibe einen SOAP-Server, XML-Anforderungen empfängt und XML-Antworten erstellt. (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 Wert drehen Artikel.

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

Sie können auch (relativ) leicht Listen als auch bauen, 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!

Für ernsthafte Arbeit mit XML in Python verwenden lxml

Python kommt mit ElementTree integrierten Bibliothek, aber lxml erstreckt es in Bezug auf Geschwindigkeit und Funktionalität (Schema-Validierung, sax Parsing, XPath, verschiedene Arten von Iteratoren und vielen anderen 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 erlaubt, macht aber eine Ausnahme für lxml, pyyaml, und einige andere) .

Gebäude XML-Dokumente 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 sein scheint zu bedienen und auch leicht zu lesen.

Beispielcode von lxml doc E-Werk zur Verwendung von (leicht vereinfachte ):


Das E-Werk bietet eine einfache und kompakte Syntax zum Erzeugen 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 auf E-Werk es Dinge folgende

-Code liest sich fast wie das resultierende XML-Dokument

Ablesbarkeit zählt.

Ermöglicht die Erstellung eines XML-Content

Unterstützt Sachen wie:

  • Verwendung von Namensräumen
  • Starten und Beenden von Textknoten innerhalb eines Elements
  • Funktionen Attribut Content-Formatierung (func CLASS in voll lxml Probe )

Ermöglicht sehr lesbare Konstrukte mit Listen

z.

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)

ergibt:

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

Schlussfolgerungen

Ich empfehle lxml Tutorial zu lesen - es ist sehr gut geschrieben und werden Sie viele weitere Gründe geben, diese leistungsfähige Bibliothek verwenden

.

Der einzige Nachteil von lxml ist, dass es kompiliert werden müssen. Siehe SO beantworten, um weitere Tipps wie lxml von Rad-Format Paket innerhalb eines Bruchteils einer Sekunde installieren.

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.

ich empfehlen SAX - Simple API for XML - Umsetzung 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 DOM Stil XML Parser validieren.

Ich gehe davon aus, dass die .NET-Wege-XML-Verarbeitung auf einige Version von MSXML und in diesem Fall baut 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 habe auch lieber mit ElementTree arbeiten, wenn sie mit xml in Python zu tun, ist es eine sehr ordentliche Bibliothek.

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