Frage

Python hat mehr Möglichkeiten, XML zu analysieren ...

Ich verstehe die Grundlagen mit SAX parsen . Es fungiert als Stream-Parser, mit einer ereignisgesteuerten API.

Ich verstehe die DOM Parser auch. Es liest die XML-Daten in Speicher und wandelt sie in Objekte, die mit Python zugegriffen werden kann.

Im Allgemeinen war es leicht, zwischen den beiden, je nach wählen, was Sie tun musste, Speicherbeschränkungen, Leistung, etc.

(Hoffentlich bin ich so weit in Ordnung.)

Seit Python 2.5, haben wir auch ElementTree . Wie wirkt sich das auf DOM und SAX vergleichen? Welches ist es ähnlich wie? Warum ist es besser als die vorherigen Parser?

War es hilfreich?

Lösung

ElementTree ist viel einfacher zu bedienen, weil es eine XML-Struktur (im Wesentlichen) als eine Struktur von Listen darstellt und Attribute werden als Wörterbücher dargestellt.

ElementTree braucht viel weniger Speicher für XML-Bäume als DOM (und damit schneller) und über Kopf über iterparse das Parsen ist vergleichbar mit SAX. Zusätzlich iterparse kehrt Teilstrukturen, und Sie können so schnell durch Verwerfen der Strukturen bei der Analyse der Speichernutzung konstant halten, wie Sie sie verarbeiten.

ElementTree, wie in Python 2.5, hat nur einen Satz kleinen Feature im Vergleich zu ausgewachsenen XML-Bibliotheken, aber es ist genug für viele Anwendungen. Wenn Sie eine Validierung Parser oder vollständige XPath-Unterstützung benötigen, lxml ist der Weg zu gehen. Für eine lange Zeit, verwendet es recht instabil zu sein, aber ich habe keine Probleme mit ihm seit 2.1 hatte.

ElementTree weicht von DOM, wo Knoten Zugriff auf ihre Eltern und Geschwister. tatsächlichen Dokumente eher als Datenspeicher Handhabung ist auch ein wenig umständlich, weil Textknoten als Ist-Knoten nicht behandelt werden. In dem XML-Snippet

<a>This is <b>a</b> test</a>

Der String test wird die sogenannte tail des Elements b sein.

Im Allgemeinen ich ElementTree als Standard für alle XML-Verarbeitung mit Python und DOM oder SAX wie die Lösungen für spezifische Probleme empfehlen.

Andere Tipps

Minimal DOM-Implementierung:

Link- .

Python liefert eine vollständige, W3C-Standard-Implementierung von XML-DOM ( xml.dom ) und ein minimal ein, xml.dom.minidom . Diese letztere ist einfacher und kleiner als die vollständige Umsetzung. Doch von einer „Parsen Perspektive“, sie alle Vor- und Nachteile des Standard-DOM hat - d. H lädt es alles im Speicher

Unter Berücksichtigung eine einfache XML-Datei:

<?xml version="1.0"?>
<catalog>
    <book isdn="xxx-1">
      <author>A1</author>
      <title>T1</title>
    </book>
    <book isdn="xxx-2">
      <author>A2</author>
      <title>T2</title>
    </book>
</catalog>

Ein möglicher Python-Parser mit minidom ist:

import os
from xml.dom import minidom
from xml.parsers.expat import ExpatError

#-------- Select the XML file: --------#
#Current file name and directory:
curpath = os.path.dirname( os.path.realpath(__file__) )
filename = os.path.join(curpath, "sample.xml")
#print "Filename: %s" % (filename)

#-------- Parse the XML file: --------#
try:
    #Parse the given XML file:
    xmldoc = minidom.parse(filepath)
except ExpatError as e:
    print "[XML] Error (line %d): %d" % (e.lineno, e.code)
    print "[XML] Offset: %d" % (e.offset)
    raise e
except IOError as e:
    print "[IO] I/O Error %d: %s" % (e.errno, e.strerror)
    raise e
else:
    catalog = xmldoc.documentElement
    books = catalog.getElementsByTagName("book")

    for book in books:
        print book.getAttribute('isdn')
        print book.getElementsByTagName('author')[0].firstChild.data
        print book.getElementsByTagName('title')[0].firstChild.data

Beachten Sie, dass xml.parsers.expat ist eine Python-Schnittstelle zur Expat nicht validierenden XML-Parser (docs.python.org/2/library/pyexpat.html).

Die xml.dom Paket liefert auch die Ausnahmeklasse DOMException , aber es ist nicht supperted in minidom

Das ElementTree XML API:

Link-.

ElementTree ist viel einfacher zu bedienen und erfordert weniger Speicher als XML DOM. Weiterhin ist eine C-Implementierung zur Verfügung ( xml.etree.cElementTree ).

Ein möglicher Python-Parser mit ElementTree ist:

import os
from xml.etree import cElementTree  # C implementation of xml.etree.ElementTree
from xml.parsers.expat import ExpatError  # XML formatting errors

#-------- Select the XML file: --------#
#Current file name and directory:
curpath = os.path.dirname( os.path.realpath(__file__) )
filename = os.path.join(curpath, "sample.xml")
#print "Filename: %s" % (filename)

#-------- Parse the XML file: --------#
try:
    #Parse the given XML file:
    tree = cElementTree.parse(filename)
except ExpatError as e:
    print "[XML] Error (line %d): %d" % (e.lineno, e.code)
    print "[XML] Offset: %d" % (e.offset)
    raise e
except IOError as e:
    print "[XML] I/O Error %d: %s" % (e.errno, e.strerror)
    raise e
else:
    catalogue = tree.getroot()

    for book in catalogue:
        print book.attrib.get("isdn")
        print book.find('author').text
        print book.find('title').text

ElementTree des Parse () ist wie DOM, während iterparse () wie SAX ist. Meiner Meinung nach, ist ElementTree besser als DOM und SAX, dass es bietet API einfacher, mit zu arbeiten.

ElementTree hat mehr pythonic API. Es ist auch in der Standard-Bibliothek jetzt so verwenden und reduziert Abhängigkeiten.

ich eigentlich lieber lxml da es API wie ElementTree, hat aber auch schöne zusätzliche Funktionen und funktioniert gut.

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