Python3 XML-Parsing
Was ist XML?
XML steht für die Extensible Markup Language (eXtensible Markup LXtensible Markup Language), eine Teilmenge der Standard Generalized Markup Language, und ist eine Auszeichnungssprache, mit der elektronische Dateien so ausgezeichnet werden, dass sie strukturiert sind. Auf dieser Website können Sie mehr erfahrenXML-Tutorial
XML wurde entwickelt, um Daten zu übertragen und zu speichern.
XML ist eine Reihe von Regeln zur Definition semantischer Tags. Diese Tags unterteilen ein Dokument in viele Teile und identifizieren diese Teile.
Es ist auch eine Meta-Auszeichnungssprache, das heißt, eine syntaktische Sprache, die verwendet wird, um andere semantische, strukturierte Auszeichnungssprachen für bestimmte Domänen zu definieren.
XML-Parsing in Python
Gängige XML-Programmierschnittstellen sind DOM und SAX. Diese beiden Schnittstellen behandeln XML-Dateien unterschiedlich, daher werden sie in unterschiedlichen Situationen eingesetzt.
Python bietet drei Methoden zum Parsen von XML: ElementTree, SAX und DOM.
1. ElementTree
xml.etree.ElementTree ist ein Modul in der Python-Standardbibliothek zur Verarbeitung von XML. Es bietet eine einfache und effiziente API zum Parsen und Generieren von XML-Dokumenten.
2.SAX (einfache API für XML)
Die Python-Standardbibliothek enthält einen SAX-Parser. SAX verwendet ein ereignisgesteuertes Modell, verarbeitet XML-Dateien durch das nacheinander erfolgende Auslösen von Ereignissen und ruft während des XML-Parsings benutzerdefinierte Callback-Funktionen auf.
3.DOM(Document Object Model)
Es parst XML-Daten in einen Baum im Speicher und arbeitet mit XML, indem es den Baum manipuliert.
Die in diesem Kapitel verwendeten XML-Beispieldateienmovies.xmlDer Inhalt ist wie folgt:
Beispiele
<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Gespräch ü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>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
<type>Komödie</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Anschaubare Langeweile</description>
</movie>
</collection>
Python verwendet ElementTree zum Parsen von XML
xml.etree.ElementTreeist ein Modul in der Python-Standardbibliothek zur Verarbeitung von XML.
Im Folgenden werden einige Schlüsselkonzepte und die Verwendung des Moduls xml.etree.ElementTree vorgestellt:
ElementTree- und Element-Objekte:
- ElementTree: Die Klasse ElementTree ist eine Baumdarstellung eines XML-Dokuments. Sie enthält ein oder mehrere Element-Objekte und repräsentiert das gesamte XML-Dokument.
- Element: Das Element-Objekt repräsentiert ein Element in einem XML-Dokument. Jedes Element hat ein Tag, eine Reihe von Attributen und null oder mehr untergeordnete Elemente.
XML parsen
fromstring()-Methode: Sie können die fromstring()-Methode verwenden, um eine Zeichenkette mit XML-Daten in ein Element-Objekt umzuwandeln:
Beispiel
xml_string = '<root><element>Some data</element></root>'
root = ET.fromstring(xml_string)
parse()-Methode: Wenn die XML-Daten in einer Datei gespeichert sind, können Sie die parse()-Methode verwenden, um das gesamte XML-Dokument zu parsen:
tree = ET.parse('example.xml')
root = tree.getroot()
Durchlaufen des XML-Baums
find()-Methode: Verwenden Sie die find()-Methode, um das erste untergeordnete Element mit dem angegebenen Tag zu finden:
title_element = root.find('title')findall()-Methode: Verwenden Sie die findall()-Methode, um alle untergeordneten Elemente mit dem angegebenen Tag zu finden:
book_elements = root.findall('book')
Zugriff auf Elementattribute und Textinhalte
attrib-Attribut: Sie können über das attrib-Attribut auf die Attribute eines Elements zugreifen:
price = book_element.attrib['price']
text-Textinhalt: Sie können über das text-Attribut auf den Textinhalt des Elements zugreifen:
title_text = title_element.text
XML erstellen
Element()-Konstruktor: Verwenden Sie den Element()-Konstruktor, um ein neues Element zu erstellen:
new_element = ET.Element('new_element')SubElement()-Funktion: Verwenden Sie die Funktion SubElement(), um ein untergeordnetes Element mit dem angegebenen Tag zu erstellen:
new_sub_element = ET.SubElement(root, 'new_sub_element')
XML ändern
Ändern Sie die Attribute und den Textinhalt des Elements: Ändern Sie direkt die Attribute attrib und text des Elements.
Ein Element löschen: Sie können ein Element mit der Methode remove() löschen:
root.remove(title_element)
Einfaches Lesen von XML-Inhalt:
Beispiel
# Eine XML-Zeichenkette definieren
xml_string = '''
<bookstore>
<book>
<title>Einführung in Python</title>
<author>John Doe</author>
<price>29.99</price>
</book>
<book>
<title>Data Science mit Python</title>
<author>Jane Smith</author>
<price>39.95</price>
</book>
</bookstore>
'''
# Verwende ElementTree, um den XML-String zu parsen
root = ET.fromstring(xml_string)
# Durchlaufe den XML-Baum
for book in root.findall('book'):
title = book.find('title').text
author = book.find('author').text
price = book.find('price').text
print(f'Title: {title}, Author: {author}, Price: {price}')
Die Ausgabe nach Ausführung des obigen Codes ist:
Title: Introduction to Python, Author: John Doe, Price: 29.99 Title: Data Science with Python, Author: Jane Smith, Price: 39.95
Als Nächstes werden wir ein XML-Dokument mit Buchinformationen erstellen und dann dieses Modul verwenden, um es zu parsen und zu bearbeiten:
Beispiel
# Erstelle ein XML-Dokument
root = ET.Element('bookstore')
# Füge das erste Buch hinzu
book1 = ET.SubElement(root, 'book')
title1 = ET.SubElement(book1, 'title')
title1.text = 'Einführung in Python'
author1 = ET.SubElement(book1, 'author')
author1.text = 'Max Mustermann'
price1 = ET.SubElement(book1, 'price')
price1.text = '29.99'
# Füge das zweite Buch hinzu
book2 = ET.SubElement(root, 'book')
title2 = ET.SubElement(book2, 'title')
title2.text = 'Data Science with Python'
author2 = ET.SubElement(book2, 'author')
author2.text = 'Jane Smith'
price2 = ET.SubElement(book2, 'price')
price2.text = '39.95'
# XML-Dokument in einer Datei speichern
tree = ET.ElementTree(root)
tree.write('books.xml')
# XML-Dokument aus der Datei parsen
parsed_tree = ET.parse('books.xml')
parsed_root = parsed_tree.getroot()
# XML-Baum durchlaufen und Buchinformationen ausgeben
for book in parsed_root.findall('book'):
title = book.find('title').text
author = book.find('author').text
price = book.find('price').text
print(f'Title: {title}, Author: {author}, Price: {price}')
Im obigen Beispiel erstellen wir zunächst ein XML-Dokument mit Informationen über zwei Bücher. Dann speichern wir dieses Dokument in der Datei books.xml. Als Nächstes verwenden wir die Methode ET.parse(), um das XML-Dokument in der Datei zu parsen, den Dokumentbaum zu durchlaufen und Titel, Autor und Preis jedes Buches zu extrahieren und auszugeben.
Python verwendet SAX zum Parsen von XML
SAX ist eine ereignisgesteuerte API.
Die Verwendung von SAX zum Parsen von XML-Dokumenten 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 wiederum ist dafür verantwortlich, auf Ereignisse zu reagieren und die übergebenen XML-Daten zu verarbeiten.
- 1. Verarbeitung großer Dateien;
- 2. Nur einen Teil des Dateiinhalts zu benötigen oder nur bestimmte Informationen aus der Datei abrufen zu müssen.
- 3. Wenn Sie Ihr eigenes Objektmodell erstellen möchten.
Um XML mit dem SAX-Ansatz in Python zu verarbeiten, müssen Sie zunächst die Funktion parse aus xml.sax sowie ContentHandler aus xml.sax.handler importieren.
Einführung in die Methoden der Klasse ContentHandler
Methode characters(content)
Wenn es aufgerufen wird:
Vom Anfang einer Zeile, bevor ein Tag angetroffen wird: Wenn Zeichen vorhanden sind, ist der Wert von content diese Zeichenfolgen.
Von einem Tag bis bevor das nächste Tag angetroffen wird: Wenn Zeichen vorhanden sind, ist der Wert von content diese Zeichenfolgen.
Von einem Tag bis bevor das Zeilenabschlusszeichen angetroffen wird: Wenn Zeichen vorhanden sind, ist der Wert von content diese Zeichenfolgen.
Tags können Start-Tags oder End-Tags 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 Name des Tags, 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, eine Liste von Parsern
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 Methode parseString erstellt einen XML-Parser und parst den XML-String:
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Parameter:
- 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-Beispiele
Beispiel
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 = ""
# Wird aufgerufen, wenn ein Element beginnt
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print ("*****Film*****")
title = attributes["title"]
print ("Titel:", title)
# Wird aufgerufen, wenn ein Element endet
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 = ""
# Wird aufgerufen, wenn Zeichen gelesen werden
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__"):
# Einen 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 Ergebnis der Ausführung 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 beachten Sie die vollständige SAX-API-Dokumentation.Python SAX APIs
XML mit xml.dom parsen
Das Document Object Model (DOM) ist eine vom W3C empfohlene Standard-Programmierschnittstelle zur Verarbeitung erweiterbarer Auszeichnungssprachen.
Ein DOM-Parser liest beim Parsen eines XML-Dokuments das gesamte Dokument auf einmal und speichert alle Elemente des Dokuments in einer Baumstruktur im Speicher. Anschließend können Sie die verschiedenen von DOM bereitgestellten Funktionen verwenden, um den Inhalt und die Struktur des Dokuments zu lesen oder zu ändern und den geänderten Inhalt auch in eine XML-Datei zu schreiben.
In Python verwenden Sie xml.dom.minidom, um XML-Dateien zu parsen. Ein Beispiel ist wie folgt:
Beispiel
from xml.dom.minidom import parse
import xml.dom.minidom
# Öffne das XML-Dokument mit dem minidom-Parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print ("Wurzelelement : %s" % collection.getAttribute("shelf"))
# Alle Filme aus 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 Ergebnis der Ausführung 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 lesen Sie die vollständige DOM-API-Dokumentation.Python DOM APIs。
Andere Erweiterungen