Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Python

Python XML Verwerking: Gids voor Interoperabele Databeheer

XML is een draagbare, open source taal die programmeurs in staat stelt applicaties te ontwikkelen die door andere applicaties gelezen kunnen worden, ongeacht besturingssysteem en/of ontwikkeltaal.

Wat is XML?

De Extensible Markup Language (XML) is een markup-taal die veel lijkt op HTML of SGML. Dit wordt aanbevolen door het World Wide Web Consortium en is beschikbaar als open standaard.

XML is extreem nuttig voor het bijhouden van kleine tot middelgrote hoeveelheden data zonder een SQL-gebaseerde backbone te vereisen.

XML Parser Architecturen en API's

De Python standaardbibliotheek biedt een minimaal maar nuttige set interfaces om met XML te werken.

De twee meest basaal en breed gebruikte API's voor XML-data zijn de SAX en DOM interfaces.

  • Simple API for XML (SAX) - Hier registreert u callbacks voor events van belang en laat u de parser het document doorgaan. Dit is nuttig wanneer uw documenten groot zijn of u geheugenbeperkingen hebt, het parseert het bestand terwij het het van schijf leest en het hele bestand wordt nooit in het geheugen opgeslagen.

  • Document Object Model (DOM) API - Dit is een World Wide Web Consortium aanbeveling waarbij het hele bestand in het geheugen wordt gelezen en opgeslagen in een hiërarchische (boom-gebaseerde) vorm om alle kenmerken van een XML-document weer te geven.

SAX kan informatie niet zo snel verwerken als DOM bij grote bestanden. Aan de andere kant kan het exclusief gebruik van DOM uw bronnen echt opvreten, vooral als het op veel kleine bestanden wordt gebruikt.

SAX is read-only, terwijl DOM wijzigingen in het XML-bestand toestaat. Aangezien deze twee verschillende API's elkaar letterlijk complementeren, is er geen reden waarom u ze niet beide voor grote projecten kunt gebruiken.

Voor al onze XML-codevoorbeelden gebruiken we een eenvoudig XML-bestand movies.xml als invoer:

<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 Parsen met SAX API's

SAX is een standaardinterface voor event-gedreven XML-parsing. Het parsen van XML met SAX vereist doorgaans dat u uw eigen ContentHandler maakt door xml.sax.ContentHandler te subklasseren.

Uw ContentHandler behandelt de specifieke tags en attributen van uw flavor(s) van XML. Een ContentHandler-object biedt methodes om diverse parsing-events af te handelen. De eigenaar-parser roept ContentHandler-methodes aan tijdens het parsen van het XML-bestand.

De methodes startDocument en endDocument worden aangeroepen aan het begin en het einde van het XML-bestand. De methode characters(text) krijgt tekendata van het XML-bestand via de parameter text doorgegeven.

De ContentHandler wordt aangeroepen aan het begin en einde van elk element. Als de parser niet in namespace-modus is, worden de methodes startElement(tag, attributes) en endElement(tag) aangeroepen; anders worden de overeenkomstige methodes startElementNS en endElementNS aangeroepen. Hier is tag de element-tag, en attributes is een Attributes-object.

Hier zijn andere belangrijke methodes om te begrijpen voordat u doorgaat:

De make_parser-Methode

De volgende methode maakt een nieuw parser-object aan en retourneert het. Het parser-object dat wordt aangemaakt, zal van de eerste parser-type zijn die het systeem vindt.

xml.sax.make_parser([parser_list])

Details van de parameters:

  • parser_list - Het optionele argument bestaande uit een lijst van parsers die gebruikt moeten worden, die allemaal de make_parser-methode moeten implementeren.

De parse-Methode

De volgende methode maakt een SAX-parser aan en gebruikt deze om een document te parsen.

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

Details van de parameters:

  • xmlfile - Dit is de naam van het XML-bestand om te lezen.

  • contenthandler - Dit moet een ContentHandler-object zijn.

  • errorhandler - Als gespecificeerd, moet errorhandler een SAX ErrorHandler-object zijn.

De parseString-Methode

Er is nog een methode om een SAX-parser aan te maken en de gespecificeerde XML-string te parsen.

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

Details van de parameters:

  • xmlstring - Dit is de naam van de XML-string om te lezen.

  • contenthandler - Dit moet een ContentHandler-object zijn.

  • errorhandler - Als gespecificeerd, moet errorhandler een SAX ErrorHandler-object zijn.

Voorbeeld

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

    # Aanroep wanneer een element begint
    def startElement(self, tag, attributes):
        self.CurrentData = tag
        if tag == "movie":
            print "*****Movie*****"
            title = attributes["title"]
            print "Title:", title

    # Aanroep wanneer een element eindigt
    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 = ""

    # Aanroep wanneer een karakter gelezen wordt
    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__"):
    # Een XMLReader aanmaken
    parser = xml.sax.make_parser()
    # Namespaces uitschakelen
    parser.setFeature(xml.sax.handler.feature_namespaces, 0)
    # Standaard ContextHandler overschrijven
    Handler = MovieHandler()
    parser.setContentHandler(Handler)
    parser.parse("movies.xml")

Dit produceert het volgende resultaat:

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

Voor volledige details over SAX API-documentatie, raadpleeg de standaard Python SAX API's.

XML Parsen met DOM API's

Het Document Object Model ("DOM") is een cross-language API van het World Wide Web Consortium (W3C) voor het benaderen en wijzigen van XML-documenten.

De DOM is extreem nuttig voor random-access applicaties. SAX laat u slechts een beetje van het document tegelijk zien. Als u naar één SAX-element kijkt, heeft u geen toegang tot een ander.

Hier is de eenvoudigste manier om snel een XML-document te laden en een minidom-object aan te maken met behulp van de xml.dom-module. Het minidom-object biedt een eenvoudige parse-methode die snel een DOM-boomstructuur aanmaakt vanuit het XML-bestand.

De voorbeeldcode roept de parse(file[, parser])-functie van het minidom-object aan om het XML-bestand dat door file wordt aangewezen, te parsen in een DOM-boomobject.

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

# XML-document openen met minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement

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

# Alle films in de verzameling ophalen
movies = collection.getElementsByTagName("movie")

# Details van elke film printen
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

Dit produceert het volgende resultaat:

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

Voor volledige details over DOM API-documentatie, raadpleeg de standaard Python DOM API's.

Python

  1. Python Datatypes onder de knie krijgen: Een praktische gids
  2. Python Operators onder de knie krijgen: Een uitgebreide gids
  3. Python Pass Statement onder de knie krijgen: Een praktische gids
  4. Python Functie-argumenten onder de knie krijgen: Positionele, Keyword en Default Parameters
  5. Python-dictionaries beheersen: aanmaken, manipuleren en geavanceerde technieken
  6. Python-iterators: hoe ze werken en hoe je je eigen maakt
  7. Python-closures uitgelegd: hoe geneste functies variabelen vangen
  8. Python datetime beheersen: praktische gids voor datums, tijden en tijdzones
  9. Python's time.sleep() onder de knie krijgen: best practices, multithreading en real-world voorbeelden
  10. Python Overzicht: Hoog-Niveau, Leesbaar, Interactief & Object-Georiënteerd
  11. Python Numbers: Immutable Numerieke Datatypes Begrijpen