Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Python

Python XML-Verarbeitung: Leitfaden für interoperable Datenverwaltung

Was ist XML?

Extensible Markup Language (XML) ist eine Auszeichnungssprache ähnlich HTML oder SGML. Sie wird vom World Wide Web Consortium empfohlen und ist als offener Standard verfügbar.

XML eignet sich hervorragend, um kleine bis mittlere Datenmengen zu verwalten, ohne einen SQL-basierten Backbone zu benötigen.

XML Parser-Architekturen und APIs

Die Python-Standardbibliothek bietet ein minimales, aber nützliches Set an Schnittstellen für XML-Arbeit.

Die zwei grundlegendsten und am weitesten verbreiteten APIs für XML-Daten sind SAX und DOM:

SAX kann Informationen bei großen Dateien nicht so schnell verarbeiten wie DOM. Andererseits kann DOM bei vielen kleinen Dateien Ihre Ressourcen stark belasten.

SAX ist read-only, DOM erlaubt Änderungen an der XML-Datei. Da sich diese APIs ergänzen, können beide in großen Projekten gemeinsam eingesetzt werden.

Beispieldatei: movies.xml

<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 scientific 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 parsen

SAX ist ein Standard-Interface für event-getriebenes XML-Parsing. Erfordert das Erstellen eines eigenen ContentHandler durch Subclassing von xml.sax.ContentHandler.

Ihr ContentHandler behandelt die spezifischen Tags und Attribute Ihres XML-Flavors. Ein ContentHandler-Objekt stellt Methoden für verschiedene Parsing-Events bereit. Der Parser ruft diese Methoden während des Parsens auf.

Die make_parser-Methode

xml.sax.make_parser([parser_list])

Erstellt ein neues Parser-Objekt. parser_list (optional): Liste von Parsern, die make_parser implementieren müssen.

Die parse-Methode

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

Erstellt SAX-Parser und parst Dokument. Parameter: xmlfile (Dateiname), contenthandler (ContentHandler-Objekt), errorhandler (optional, SAX ErrorHandler).

Die parseString-Methode

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

Parst einen XML-String. Parameter analog zu parse.

Beispiel: SAX-Parsing

#!/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 = ""

    def startElement(self, tag, attributes):
        self.CurrentData = tag
        if tag == "movie":
            print("*****Movie*****")
            title = attributes["title"]
            print("Title:", title)

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

    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__":
    parser = xml.sax.make_parser()
    parser.setFeature(xml.sax.handler.feature_namespaces, 0)
    Handler = MovieHandler()
    parser.setContentHandler(Handler)
    parser.parse("movies.xml")

Ausgabe:

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

Für vollständige SAX-API-Dokumentation siehe Python SAX APIs.

XML mit DOM parsen

Das Document Object Model (DOM) ist eine sprachenübergreifende API vom W3C für Zugriff und Modifikation von XML-Dokumenten.

DOM ist extrem nützlich für Random-Access-Anwendungen. SAX erlaubt nur die Sicht auf einen Dokumentteil zur Zeit.

Einfacher Weg: XML-Dokument laden und minidom-Objekt mit xml.dom.minidom erstellen. Die parse(file[, parser])-Funktion parst die XML-Datei in einen DOM-Tree.

Beispiel: DOM-Parsing

#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom

DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement

if collection.hasAttribute("shelf"):
    print("Root element : %s" % collection.getAttribute("shelf"))

movies = collection.getElementsByTagName("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:

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

Für vollständige DOM-API-Dokumentation siehe Python DOM APIs.

Python

  1. Python-Datentypen meistern: Praxisleitfaden
  2. Python-Operatoren meistern: Umfassender Leitfaden
  3. Python pass-Statement meistern: Praxisleitfaden
  4. Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
  5. Python-Dictionaries meistern: Erstellung, Manipulation und fortgeschrittene Techniken
  6. Python Iteratoren meistern: Funktionsweise und Erstellung eigener Iteratoren
  7. Python Closures erklärt: Wie verschachtelte Funktionen Variablen erfassen
  8. Python datetime meistern: Praktischer Leitfaden zu Datumsangaben, Zeiten und Zeitzonen
  9. Pythons time.sleep() meistern: Best Practices, Multithreading und Praxisbeispiele
  10. Python Überblick: Hochlevel, lesbar, interaktiv & objektorientiert