Python - XML-Verarbeitung
Vorherige SeiteNächste Seite
XML ist eine portable Open-Source-Sprache, die es Programmierern ermöglicht, Anwendungen zu entwickeln, die von anderen Anwendungen gelesen werden können, unabhängig von Betriebssystem und/oder Entwicklungssprache.
Was ist XML?
Die Extensible Markup Language (XML) ist eine Auszeichnungssprache ähnlich wie HTML oder SGML. Dies wird vom World Wide Web Consortium empfohlen und ist als offener Standard verfügbar.
XML ist äußerst nützlich, um kleine bis mittlere Datenmengen zu verfolgen, ohne dass ein SQL-basiertes Backbone erforderlich ist.
XML-Parser-Architekturen und APIs
Die Python-Standardbibliothek bietet einen minimalen, aber nützlichen Satz von Schnittstellen für die Arbeit mit XML.
Die zwei grundlegendsten und am weitesten verbreiteten APIs für XML-Daten sind die SAX- und DOM-Schnittstellen.
-
Einfache API für XML (SAX) − Hier registrieren Sie Rückrufe für interessante Ereignisse und lassen dann den Parser durch das Dokument gehen. Dies ist nützlich, wenn Ihre Dokumente groß sind oder Sie Speicherbeschränkungen haben, es parst die Datei, während es sie von der Festplatte liest, und die gesamte Datei wird nie im Speicher gespeichert.
-
Document Object Model (DOM)-API − Dies ist eine Empfehlung des World Wide Web Consortium, bei der die gesamte Datei in den Speicher eingelesen und in einer hierarchischen (baumbasierten) Form gespeichert wird, um alle Merkmale eines XML-Dokuments darzustellen.
Offensichtlich kann SAX Informationen nicht so schnell verarbeiten wie DOM, wenn es mit großen Dateien arbeitet. Andererseits kann die ausschließliche Verwendung von DOM Ihre Ressourcen wirklich vernichten, besonders wenn es für viele kleine Dateien verwendet wird.
SAX ist schreibgeschützt, während DOM Änderungen an der XML-Datei zulässt. Da sich diese beiden verschiedenen APIs buchstäblich ergänzen, gibt es keinen Grund, warum Sie sie nicht beide für große Projekte verwenden können.
Verwenden wir für alle unsere XML-Codebeispiele eine einfache XML-Datei movies.xml als Eingabe −
<collection shelf="New Arrivals"> <movie title="Enemy Behind"> <type>War, Thriller</type> <format>DVD</format> <year>2003</year> <rating>PG</rating> <stars>10</stars> <description>Talk about a US-Japan war</description> </movie> <movie title="Transformers"> <type>Anime, Science Fiction</type> <format>DVD</format> <year>1989</year> <rating>R</rating> <stars>8</stars> <description>A schientific fiction</description> </movie> <movie title="Trigun"> <type>Anime, Action</type> <format>DVD</format> <episodes>4</episodes> <rating>PG</rating> <stars>10</stars> <description>Vash the Stampede!</description> </movie> <movie title="Ishtar"> <type>Comedy</type> <format>VHS</format> <rating>PG</rating> <stars>2</stars> <description>Viewable boredom</description> </movie> </collection>
XML mit SAX-APIs parsen
SAX ist eine Standardschnittstelle für ereignisgesteuertes XML-Parsing. Das Analysieren von XML mit SAX erfordert im Allgemeinen, dass Sie Ihren eigenen ContentHandler erstellen, indem Sie xml.sax.ContentHandler.
unterklassenIhr ContentHandler handhabt die besonderen Tags und Attribute Ihrer XML-Variante(n). Ein ContentHandler-Objekt stellt Methoden bereit, um verschiedene Parsing-Ereignisse zu behandeln. Sein besitzender Parser ruft ContentHandler-Methoden auf, während er die XML-Datei parst.
Die Methoden startDocument und endDocument werden am Anfang und am Ende der XML-Datei aufgerufen. Die Methode characters(text) werden über den Parameter text.
Zeichendaten der XML-Datei übergebenDer ContentHandler wird am Anfang und am Ende jedes Elements aufgerufen. Befindet sich der Parser nicht im Namespace-Modus, werden die Methoden startElement(tag, attributes) und endElement(tag) werden genannt; andernfalls die entsprechenden Methoden startElementNS und endElementNS werden genannt. Hier ist Tag das Element-Tag und Attribute ein Attributes-Objekt.
Hier sind weitere wichtige Methoden, die Sie verstehen sollten, bevor Sie fortfahren −
Der make_parser Methode
Die folgende Methode erstellt ein neues Parser-Objekt und gibt es zurück. Das erstellte Parser-Objekt ist der erste Parser-Typ, den das System findet.
xml.sax.make_parser( [parser_list] )
Hier ist das Detail der Parameter −
-
parser_list − Das optionale Argument, bestehend aus einer Liste von zu verwendenden Parsern, die alle die Methode make_parser implementieren müssen.
Die Analyse Methode
Die folgende Methode erstellt einen SAX-Parser und verwendet ihn zum Parsen eines Dokuments.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Hier ist das Detail der Parameter −
-
xml-Datei − Dies ist der Name der XML-Datei, aus der gelesen werden soll.
-
Contenthandler − Dies muss ein ContentHandler-Objekt sein.
-
Fehlerbehandlung − Falls angegeben, muss errorhandler ein SAX-ErrorHandler-Objekt sein.
Der parseString Methode
Es gibt noch eine weitere Methode, um einen SAX-Parser zu erstellen und den angegebenen XML-String zu parsen .
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Hier ist das Detail der Parameter −
-
xmlstring − Dies ist der Name des XML-Strings, aus dem gelesen werden soll.
-
Contenthandler − Dies muss ein ContentHandler-Objekt sein.
-
Fehlerbehandlung − Falls angegeben, muss errorhandler ein SAX-ErrorHandler-Objekt sein.
Beispiel
#!/usr/bin/python import xml.sax class MovieHandler( xml.sax.ContentHandler ): def __init__(self): self.CurrentData = "" self.type = "" self.format = "" self.year = "" self.rating = "" self.stars = "" self.description = "" # Call when an element starts def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Movie*****" title = attributes["title"] print "Title:", title # Call when an elements ends def endElement(self, tag): if self.CurrentData == "type": print "Type:", self.type elif self.CurrentData == "format": print "Format:", self.format elif self.CurrentData == "year": print "Year:", self.year elif self.CurrentData == "rating": print "Rating:", self.rating elif self.CurrentData == "stars": print "Stars:", self.stars elif self.CurrentData == "description": print "Description:", self.description self.CurrentData = "" # Call when a character is read def characters(self, content): if self.CurrentData == "type": self.type = content elif self.CurrentData == "format": self.format = content elif self.CurrentData == "year": self.year = content elif self.CurrentData == "rating": self.rating = content elif self.CurrentData == "stars": self.stars = content elif self.CurrentData == "description": self.description = content if ( __name__ == "__main__"): # create an XMLReader parser = xml.sax.make_parser() # turn off namepsaces parser.setFeature(xml.sax.handler.feature_namespaces, 0) # override the default ContextHandler Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")
Dies würde folgendes Ergebnis erzeugen −
*****Movie***** Title: Enemy Behind Type: War, Thriller Format: DVD Year: 2003 Rating: PG Stars: 10 Description: Talk about a US-Japan war *****Movie***** Title: Transformers Type: Anime, Science Fiction Format: DVD Year: 1989 Rating: R Stars: 8 Description: A schientific fiction *****Movie***** Title: Trigun Type: Anime, Action Format: DVD Rating: PG Stars: 10 Description: Vash the Stampede! *****Movie***** Title: Ishtar Type: Comedy Format: VHS Rating: PG Stars: 2 Description: Viewable boredom
Ausführliche Informationen zur SAX-API-Dokumentation finden Sie unter Standard-Python-SAX-APIs.
XML mit DOM-APIs parsen
Das Document Object Model ("DOM") ist eine sprachübergreifende API des World Wide Web Consortium (W3C) für den Zugriff auf und die Änderung von XML-Dokumenten.
Das DOM ist äußerst nützlich für Anwendungen mit wahlfreiem Zugriff. Mit SAX können Sie jeweils nur einen Teil des Dokuments anzeigen. Wenn Sie sich ein SAX-Element ansehen, haben Sie keinen Zugriff auf ein anderes.
Hier ist der einfachste Weg, schnell ein XML-Dokument zu laden und ein Minidom-Objekt mit dem xml.dom-Modul zu erstellen. Das Minidom-Objekt bietet eine einfache Parser-Methode, die schnell einen DOM-Baum aus der XML-Datei erstellt.
Der Beispielsatz ruft die Funktion parse( file [,parser] ) des Minidom-Objekts auf, um die durch file bezeichnete XML-Datei in ein DOM-Baumobjekt zu parsen.
#!/usr/bin/python from xml.dom.minidom import parse import xml.dom.minidom # Open XML document using minidom parser DOMTree = xml.dom.minidom.parse("movies.xml") collection = DOMTree.documentElement if collection.hasAttribute("shelf"): print "Root element : %s" % collection.getAttribute("shelf") # Get all the movies in the collection movies = collection.getElementsByTagName("movie") # Print detail of each movie. for movie in movies: print "*****Movie*****" if movie.hasAttribute("title"): print "Title: %s" % movie.getAttribute("title") type = movie.getElementsByTagName('type')[0] print "Type: %s" % type.childNodes[0].data format = movie.getElementsByTagName('format')[0] print "Format: %s" % format.childNodes[0].data rating = movie.getElementsByTagName('rating')[0] print "Rating: %s" % rating.childNodes[0].data description = movie.getElementsByTagName('description')[0] print "Description: %s" % description.childNodes[0].data
Dies würde zu folgendem Ergebnis führen −
Root element : New Arrivals *****Movie***** Title: Enemy Behind Type: War, Thriller Format: DVD Rating: PG Description: Talk about a US-Japan war *****Movie***** Title: Transformers Type: Anime, Science Fiction Format: DVD Rating: R Description: A schientific fiction *****Movie***** Title: Trigun Type: Anime, Action Format: DVD Rating: PG Description: Vash the Stampede! *****Movie***** Title: Ishtar Type: Comedy Format: VHS Rating: PG Description: Viewable boredom
Ausführliche Informationen zur DOM-API-Dokumentation finden Sie unter Standard-Python-DOM-APIs.
Python