Python 3 - XML-Verarbeitung

XML ist eine tragbare Open-Source-Sprache, mit der Programmierer Anwendungen entwickeln können, die von anderen Anwendungen gelesen werden können, unabhängig vom Betriebssystem und / oder der Entwicklungssprache.

Was ist XML?

Die Extensible Markup Language (XML) ist eine Markup-Sprache, die HTML oder SGML ähnelt. 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 ein SQL-basiertes Backbone zu benötigen.

XML-Parser-Architekturen und APIs

Die Python-Standardbibliothek bietet einen minimalen, aber nützlichen Satz von Schnittstellen für die Arbeit mit XML.

Die beiden grundlegendsten und am weitesten verbreiteten APIs für XML-Daten sind die SAX- und DOM-Schnittstellen.

  • Simple API for XML (SAX)- Hier registrieren Sie Rückrufe für Ereignisse von Interesse und lassen den Parser das Dokument durchlaufen. Dies ist nützlich, wenn Ihre Dokumente groß sind oder wenn Sie über Speicherbeschränkungen verfügen. Sie analysiert die Datei beim Lesen von der Festplatte und die gesamte Datei wird niemals 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 Funktionen eines XML-Dokuments darzustellen.

SAX kann Informationen offensichtlich nicht so schnell verarbeiten wie DOM, wenn mit großen Dateien gearbeitet wird. Auf der anderen Seite kann die ausschließliche Verwendung von DOM Ihre Ressourcen wirklich zerstören, insbesondere 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 unterschiedlichen APIs buchstäblich ergänzen, gibt es keinen Grund, warum Sie sie nicht beide für große Projekte verwenden können.

Verwenden Sie 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>

Analysieren von XML mit SAX-APIs

SAX ist eine Standardschnittstelle für ereignisgesteuertes XML-Parsing. Für das Parsen von XML mit SAX müssen Sie im Allgemeinen Ihren eigenen ContentHandler erstellen, indem Sie xml.sax.ContentHandler unterklassifizieren.

Ihr ContentHandler verwaltet die bestimmten Tags und Attribute Ihrer XML- Version (en). Ein ContentHandler-Objekt bietet Methoden zum Behandeln verschiedener Analyseereignisse. Sein besitzender Parser ruft ContentHandler-Methoden auf, während er die XML-Datei analysiert.

Die Methoden startDocument und endDocument werden am Anfang und am Ende der XML-Datei aufgerufen. Die Methodenzeichen (Text) werden über den Parametertext an die Zeichendaten der XML-Datei übergeben.

Der ContentHandler wird am Anfang und Ende jedes Elements aufgerufen. Befindet sich der Parser nicht im Namespace-Modus, werden die Methoden startElement (Tag, Attribute) und endElement (Tag) aufgerufen. Andernfalls werden die entsprechenden Methoden startElementNS und endElementNS aufgerufen. Hier ist Tag das Element-Tag und Attribute ein Attributes-Objekt.

Hier sind andere wichtige Methoden, die Sie verstehen sollten, bevor Sie fortfahren:

Die make_parser-Methode

Die folgende Methode erstellt ein neues Parserobjekt und gibt es zurück. Das erstellte Parserobjekt ist vom ersten Parsertyp, den das System findet.

xml.sax.make_parser( [parser_list] )

Hier sind die Details der Parameter -

  • parser_list - Das optionale Argument, das aus einer Liste der zu verwendenden Parser besteht, die alle die Methode make_parser implementieren müssen.

Die Analysemethode

Die folgende Methode erstellt einen SAX-Parser und verwendet ihn zum Parsen eines Dokuments.

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

Hier sind die Details der Parameter -

  • xmlfile - Dies ist der Name der XML-Datei, aus der gelesen werden soll.

  • contenthandler - Dies muss ein ContentHandler-Objekt sein.

  • errorhandler - Wenn angegeben, muss errorhandler ein SAX ErrorHandler-Objekt sein.

Die parseString-Methode

Es gibt noch eine weitere Methode, um einen SAX-Parser zu erstellen und den angegebenen zu analysieren XML string.

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

Hier sind die Details der Parameter -

  • xmlstring - Dies ist der Name der XML-Zeichenfolge, aus der gelesen werden soll.

  • contenthandler - Dies muss ein ContentHandler-Objekt sein.

  • errorhandler - Wenn angegeben, muss errorhandler ein SAX ErrorHandler-Objekt sein.

Beispiel

#!/usr/bin/python3

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")

Ausgabe

Dies würde das folgende 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 scientific 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 in den Standard- Python-SAX-APIs .

Analysieren von XML mit DOM-APIs

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 ein Bit des Dokuments anzeigen. Wenn Sie sich ein SAX-Element ansehen, haben Sie keinen Zugriff auf ein anderes.

Hier ist der einfachste Weg, ein XML-Dokument schnell zu laden und mit dem Modul xml.dom ein Minidom-Objekt zu erstellen. Das Minidom-Objekt bietet eine einfache Parser-Methode, mit der schnell ein DOM-Baum aus der XML-Datei erstellt wird.

Die Beispielphrase ruft die Analysefunktion (Datei [, Parser]) des Minidom-Objekts auf, um die durch die Datei angegebene XML-Datei in ein DOM-Baumobjekt zu analysieren.

Beispiel

#!/usr/bin/python3

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)

Ausgabe

Dies würde das folgende Ergebnis erzeugen -

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 scientific 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 in den Standard- Python-DOM-APIs .