Python-XML-Parsing


Was ist XML?

XML steht für die Extensible Markup Language (eXtensible Markup Lxtensible Markup Language).XML-Tutorial

XML ist dafür ausgelegt, Daten zu übertragen und zu speichern.

XML ist eine Reihe von Regeln zur Definition von semantischem Markup, das ein Dokument in viele Teile unterteilt und diese Teile identifiziert.

Es ist auch eine Meta-Markup-Sprache, das heißt, eine syntaktische Sprache, die verwendet wird, um andere semantische, strukturierte Markup-Sprachen für bestimmte Fachgebiete zu definieren.


XML mit Python parsen

Gängige XML-Programmierschnittstellen sind DOM und SAX. Diese beiden Schnittstellen verarbeiten XML-Dateien unterschiedlich und werden natürlich in unterschiedlichen Situationen eingesetzt.

Python bietet drei Methoden zum Parsen von XML: SAX, DOM und ElementTree:

1.SAX (Simple API for XML )

Die Python-Standardbibliothek enthält einen SAX-Parser. SAX verwendet ein ereignisgesteuertes Modell, das XML-Dateien verarbeitet, indem während des XML-Parsings Ereignisse nacheinander ausgelöst und benutzerdefinierte Callback-Funktionen aufgerufen werden.

2.DOM(Document Object Model)

XML-Daten in einen Baum im Speicher parsen und das XML durch Manipulation des Baums bearbeiten.

3. ElementTree (Elementbaum)

ElementTree ist wie ein leichtgewichtiges DOM mit einer praktischen und benutzerfreundlichen API. Es bietet gute Code-Verwendbarkeit, hohe Geschwindigkeit und geringen Speicherverbrauch.

Hinweis:Da DOM XML-Daten auf einen Baum im Speicher abbilden muss, ist es relativ langsam und speicherintensiv. SAX liest XML-Dateien streamend, was schneller ist und weniger Speicher verwendet, aber es erfordert, dass Benutzer Callback-Funktionen (Handler) implementieren.

Der Inhalt der in diesem Kapitel verwendeten XML-Beispieldatei movies.xml ist wie folgt:

movies.xml

<collection shelf="Neuheiten"> <movie title="Enemy Behind"> <type>Krieg, Thriller</type> <format>DVD</format> <year>2003</year> <rating>PG</rating> <stars>10</stars> <description>Sprechen wir über einen US-Japan-Krieg</description> </movie> <movie title="Transformers"> <type>Anime, Science-Fiction</type> <format>DVD</format> <year>1989</year> <rating>R</rating> <stars>8</stars> <description>Eine wissenschaftliche Fiktion</description> </movie> <movie title="Trigun"> <type>Anime, Action</type> <format>DVD</Format> <Episoden>4</Episoden> <rating>PG</rating> <stars>10</Sterne> <Beschreibung>Vash the Stampede!</Beschreibung> </Film> <Film Titel="Ishtar"> <Typ>Komödie</Typ> <Format>VHS</Format> <Bewertung>PG</Bewertung> <Sterne>2</Sterne> <Beschreibung>Ansehbare Langeweile</Beschreibung> </Film> </Collection>

Python verwendet SAX zum Parsen von XML

SAX ist eine ereignisgesteuerte API.

Das Parsen von XML-Dokumenten mit SAX umfasst zwei Teile:ParserundEvent-Handler。

Der Parser ist dafür verantwortlich, das XML-Dokument zu lesen und Ereignisse an den Event-Handler zu senden, wie z. B. Element-Start- und Element-End-Ereignisse.

Der Event-Handler ist dafür verantwortlich, auf Ereignisse zu reagieren und die übergebenen XML-Daten zu verarbeiten.

  • 1. Große Dateien verarbeiten;
  • 2. Nur einen Teil des Dateiinhalts benötigen oder nur bestimmte Informationen aus der Datei benötigen.
  • 3. Wenn Sie Ihr eigenes Objektmodell erstellen möchten.

Um XML mit SAX in Python zu verarbeiten, müssen Sie zuerst die Funktion parse aus xml.sax und ContentHandler aus xml.sax.handler importieren.

Einführung in die Methoden der Klasse ContentHandler

Methode characters(content)

Zeitpunkt des Aufrufs:

Vom Anfang der Zeile an, bevor ein Tag angetroffen wird, ist der Wert von content, falls Zeichen vorhanden sind, diese Zeichenketten.

Von einem Tag an, bevor das nächste Tag angetroffen wird, ist der Wert von content, falls Zeichen vorhanden sind, diese Zeichenketten.

Von einem Tag an, bevor das Zeilenende angetroffen wird, ist der Wert von content, falls Zeichen vorhanden sind, diese Zeichenketten.

Das Tag kann ein Start-Tag oder ein End-Tag sein.

Methode startDocument()

Wird aufgerufen, wenn das Dokument beginnt.

endDocument()-Methode

Wird aufgerufen, wenn der Parser das Ende des Dokuments erreicht.

startElement(name, attrs)-Methode

Wird aufgerufen, wenn ein XML-Start-Tag angetroffen wird. name ist der Tag-Name, und attrs ist ein Dictionary der Attributwerte des Tags.

endElement(name)-Methode

Wird aufgerufen, wenn ein XML-End-Tag angetroffen wird.


make_parser-Methode

Die folgende Methode erstellt ein neues Parser-Objekt und gibt es zurück.

xml.sax.make_parser( [parser_list] )

Parameter description:

  • parser_list- Optionaler Parameter, Parserliste

parser-Methode

Die folgende Methode erstellt einen SAX-Parser und parst ein XML-Dokument:

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

Parameter description:

  • xmlfile- XML-Dateiname
  • contenthandler- Muss ein ContentHandler-Objekt sein
  • errorhandler- Wenn dieser Parameter angegeben wird, muss errorhandler ein SAX-ErrorHandler-Objekt sein

parseString-Methode

Die parseString-Methode erstellt einen XML-Parser und parst eine XML-Zeichenfolge:

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

Parameter description:

  • xmlstring- XML-Zeichenfolge
  • contenthandler- Muss ein ContentHandler-Objekt sein
  • errorhandler- Wenn dieser Parameter angegeben wird, muss errorhandler ein SAX-ErrorHandler-Objekt sein

Python-XML-Parsing-Beispiel

Beispiel

#!/usr/bin/python # -*- coding: UTF-8 -*- 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 = "" # Behandlung des Element-Start-Ereignisses def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print "*****Film*****" title = attributes["title"] print "Titel:", title # Behandlung des Element-End-Ereignisses def endElement(self, tag): if self.CurrentData == "type": print "Typ:", self.type elif self.CurrentData == "format": print "Format:", self.format elif self.CurrentData == "year": print "Jahr:", self.year elif self.CurrentData == "rating": print "Bewertung:", self.rating elif self.CurrentData == "stars": print "Sterne:", self.stars elif self.CurrentData == "description": print "Beschreibung:", self.description self.CurrentData = "" # Inhaltsereignisbehandlung 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__"): # XMLReader erstellen parser = xml.sax.make_parser() # Namensräume deaktivieren parser.setFeature(xml.sax.handler.feature_namespaces, 0) # ContextHandler überschreiben Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")

Das Ausführungsergebnis des obigen Codes ist wie folgt:

*****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

Bitte lesen Sie die vollständige SAX-API-DokumentationPython-SAX-APIs


XML mit xml.dom parsen

Das Document Object Model (DOM) ist eine vom W3C empfohlene Standard-Programmierschnittstelle zur Verarbeitung von Extensible Markup Language.

Wenn ein DOM-Parser ein XML-Dokument parst, liest er das gesamte Dokument auf einmal ein und speichert alle Elemente in einer Baumstruktur im Speicher. Danach können Sie die verschiedenen von DOM bereitgestellten Funktionen verwenden, um den Inhalt und die Struktur des Dokuments zu lesen oder zu ändern, und Sie können den geänderten Inhalt auch in eine XML-Datei schreiben.

In Python wird xml.dom.minidom zum Parsen von XML-Dateien verwendet. Ein Beispiel ist wie folgt:

Beispiel

#!/usr/bin/python # -*- coding: UTF-8 -*- from xml.dom.minidom import parse import xml.dom.minidom # XML-Dokument mit dem minidom-Parser öffnen DOMTree = xml.dom.minidom.parse("movies.xml") collection = DOMTree.documentElement if collection.hasAttribute("shelf"): print "Wurzelelement: %s" % collection.getAttribute("shelf") # Alle Filme in der Sammlung abrufen movies = collection.getElementsByTagName("movie") # Detaillierte Informationen für jeden Film ausgeben for movie in movies: print "*****Film*****" if movie.hasAttribute("title"): print "Titel: %s" % movie.getAttribute("title") type = movie.getElementsByTagName('type')[0] print "Typ: %s" % type.childNodes[0].data format = movie.getElementsByTagName('format')[0] print "Format: %s" % format.childNodes[0].data rating = movie.getElementsByTagName('rating')[0] print "Bewertung: %s" % rating.childNodes[0].data description = movie.getElementsByTagName('description')[0] print "Beschreibung: %s" % description.childNodes[0].data

Das Ausführungsergebnis des obigen Programms ist wie folgt:

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

Bitte beachten Sie die vollständige DOM-API-DokumentationPython DOM APIs。

Weitere Erweiterungen