XML in Python für Anfänger: ElementTree & lxml mit Beispielen

目次

1. Was man vor dem Lesen von XML in Python wissen sollte

Wann verwendet man XML in Python?

Python ist eine vielseitige Programmiersprache, die für viele Zwecke eingesetzt wird, und unter anderem ist das «Lesen von XML-Dateien» eine der häufig genutzten Techniken im Bereich der Datenverarbeitung. Insbesondere in den folgenden Fällen ist das Lesen von XML mit Python erforderlich.
  • XML-Daten, die von einer Web-API abgerufen wurden, analysieren möchte
  • XML-Dateien, die aus anderen Systemen exportiert wurden, verarbeiten möchte
  • XML, das als Konfigurationsdatei (Einstellungen) verwendet wird, lesen möchte
XML kann durch seine Tagstruktur die Hierarchie und Bedeutung der Daten klar ausdrücken, weshalb es in verschiedenen Branchen eingesetzt wird. Mit Python können diese XML-Daten einfach gelesen, bearbeitet und analysiert werden.

Was ist XML? Eine kurze Wiederholung

XML (Extensible Markup Language) ist eine Markup-Sprache, mit der die Struktur von Daten flexibel definiert werden kann. Sie hat eine ähnliche Struktur wie HTML, aber einen anderen Zweck. Während HTML für die «Darstellung (Anzeige)» verwendet wird, dient XML als Format zur Beschreibung der «Struktur und Bedeutung von Daten». Zum Beispiel hat ein typisches XML das folgende Format:
<book>
  <title>Einführung in Python</title>
  <author>Yamada Tarō</author>
  <price>2800</price>
</book>
Um solche Daten in Python zu lesen und zu verwenden, ist es notwendig, spezialisierte Bibliotheken zu nutzen.

Einführung in Bibliotheken zum Lesen von XML in Python

In Python gibt es mehrere Möglichkeiten zum Lesen von XML, sowohl in der Standardbibliothek als auch in externen Bibliotheken. Die repräsentativen sind wie folgt.
  • xml.etree.ElementTree (Standardbibliothek)
  • xml.dom.minidom (Standardbibliothek)
  • lxml (Externe Bibliothek, Unterstützung für XPath und Validierung)
In diesem Artikel erklären wir auf verständliche Weise, wie man XML-Dateien in Python mit diesen Bibliotheken liest, inklusive Beispielcode. Auch für Anfänger ist es so gestaltet, dass es von den Grundlagen aus sorgfältig eingeführt wird, also machen Sie sich keine Sorgen.

2. Grundlagen zum Lesen von XML in Python

Lesen von XML-Dateien mit ElementTree

Zuerst schauen wir uns die Methode an, eine tatsächliche XML-Datei mit ElementTree zu lesen. Beispiel-XML (sample.xml):
<books>
  <book>
    <title>Einführung in Python</title>
    <author>Yamada Tarō</author>
    <price>2800</price>
  </book>
  <book>
    <title>Die Zukunft der KI</title>
    <author>Suzuki Ichirō</author>
    <price>3500</price>
  </book>
</books>
Python-Code:
import xml.etree.ElementTree as ET

# Lesen der XML-Datei
 tree = ET.parse('sample.xml')
 root = tree.getroot()

# Überprüfen des Tags des Root-Elements
 print(f"Wurzelelement: {root.tag}")

# Schleife über jedes book-Element
 for book in root.findall('book'):
     title = book.find('title').text
     author = book.find('author').text
     price = int(book.find('price').text)

     print(f"Titel: {title}, Autor: {author}, Preis: {price} Yen")
Ausführungsresultat:
Wurzelelement: books
Titel: Einführung in Python, Autor: Yamada Tarō, Preis: 2800 Yen
Titel: Die Zukunft der KI, Autor: Suzuki Ichirō, Preis: 3500 Yen
So lädt man mit ElementTree.parse() die XML-Datei, erhält mit getroot() das Root-Element und extrahiert mit find() oder findall() die benötigten Elemente – das ist der grundlegende Ablauf.

Lesen von XML aus einem String

Manchmal wird XML nicht als Datei, sondern als String bereitgestellt. In diesem Fall parst man es mit ET.fromstring(). Beispiel:
xml_data = '''
<user>
  <name>Sagawa Shōta</name>
  <email>sagawa@example.com</email>
</user>
'''

root = ET.fromstring(xml_data)

name = root.find('name').text
email = root.find('email').text

print(f"Name: {name}, E-Mail: {email}")
Auch hier kann man vom Root-Element aus die benötigten Unterelemente mit find() abrufen und die Werte extrahieren.

Abrufen von Attributen und Behandlung von Text

XML-Elemente können auch Attribute innerhalb der Tags haben. In Python greift man mit .attrib darauf zu. Beispiel (XML mit Attribut):
<user id="101">
  <name>Sagawa Shōta</name>
</user>
Python-Code:
root = ET.fromstring('''
<user id="101">
  <name>Sagawa Shōta</name>
</user>
''')

print(f"Benutzer-ID: {root.attrib['id']}")
年収訴求

3. Einführung in andere XML-Parsing-Bibliotheken

minidom: DOM-basierte Standardbibliothek

xml.dom.minidom ist ein XML-Parser, der standardmäßig in Python enthalten ist und XML basierend auf der W3C-DOM (Document Object Model)-Spezifikation verarbeiten kann. Im Vergleich zu ElementTree wird es manchmal als etwas schwieriger zu handhaben empfunden, aber es ist nützlich, wenn man die Arten und Strukturen von Knoten detailliert manipulieren möchte. Beispiel:
from xml.dom import minidom

xml_data = '''
<user>
  <name>Sagawa Shōta</name>
  <email>sagawa@example.com</email>
</user>
'''

dom = minidom.parseString(xml_data)
name = dom.getElementsByTagName('name')[0].firstChild.nodeValue
email = dom.getElementsByTagName('email')[0].firstChild.nodeValue

print(f"Name: {name}, E-Mail: {email}")
Merkmale und Vorteile:
  • Einfacher Zugriff auf detaillierte Knotenstrukturen
  • Attribute und Typen von Kindknoten sind klar klassifiziert
  • Einfache formatierte Ausgabe von XML (Pretty Print)
Nachteile:
  • Der Code neigt dazu, redundant zu werden
  • Nicht geeignet für die Verarbeitung großer XML-Dateien (hoher Speicherverbrauch)

lxml: Schnelle und leistungsstarke externe Bibliothek

lxml ist ein schneller XML-Parser, der auf C implementiert ist und erweiterte XML-Funktionen wie XPath oder XSLT unterstützt. Da es eine API ähnlich wie ElementTree bietet, ist der Lernaufwand gering. Installationsmethode:
pip install lxml
Grundlegende Verwendung:
from lxml import etree

xml_data = '''
<books>
  <book>
    <title>Python Praxis</title>
    <price>3000</price>
  </book>
</books>
'''

root = etree.fromstring(xml_data)
title = root.xpath('//book/title/text()')[0]
price = root.xpath('//book/price/text()')[0]

print(f"Titel: {title}, Preis: {price} €")
Merkmale und Vorteile:
  • Dank XPath ist flexible Suche möglich
  • Schnell und geeignet für die Verarbeitung großer XML-Mengen
  • Auch Kompatibilität mit HTML, anwendbar für Scraping
Nachteile:
  • Installation einer externen Bibliothek erforderlich
  • Etwas anfängliches Lernen erforderlich (z. B. XPath)

Zusammenfassung der Auswahl der Bibliothek

BibliothekMerkmaleGeeignete Fälle
ElementTreeStandardmäßig verfügbar, grundlegende Lese- und Schreibvorgänge möglichLaden kleiner bis mittelgroßer XML
minidomStark in DOM-Operationen, gut in formatierter AusgabeWenn detaillierte Manipulation der Knotenstruktur gewünscht
lxmlSchnell, XPath-kompatibel, hohe FlexibilitätBei großen Daten, wenn fortgeschrittene Suche benötigt wird

4. Praktische Code-Beispiele

In diesem Abschnitt führen wir die Verarbeitung zum Einlesen von XML mit Python praxisnah ein, ähnlich wie in realen Geschäftsanwendungen oder der Datenverarbeitung. Konkret zeigen wir Code-Beispiele für gängige Muster wie „Wiederholte Verarbeitung mehrerer Knoten“, „Filterung basierend auf Bedingungen“ und „Schreiben in XML-Dateien“.

Wiederholte Verarbeitung mehrerer Knoten

Wenn im XML Daten mit gleicher Struktur (z. B. mehrere <book>-Elemente) wiederholt vorkommen, wird findall() verwendet, um eine Schleifenverarbeitung durchzuführen. Beispiel-XML:
<books>
  <book>
    <title>Einführung in Python</title>
    <author>Yamada Tarō</author>
    <price>2800</price>
  </book>
  <book>
    <title>Die Zukunft der KI</title>
    <author>Suzuki Ichirō</author>
    <price>3500</price>
  </book>
</books>
Python-Code (mit ElementTree):
import xml.etree.ElementTree as ET

tree = ET.parse('books.xml')
root = tree.getroot()

for book in root.findall('book'):
    title = book.find('title').text
    author = book.find('author').text
    price = int(book.find('price').text)

    print(f"Titel: {title}, Autor: {author}, Preis: {price} Yen")
Durch den Zugriff auf einzelne Elemente innerhalb der Schleife kann so Daten aus dem XML extrahiert und verarbeitet werden.

Filterung basierend auf Bedingungen

Als Nächstes die bedingte Verarbeitung, um nur Bücher mit einem Preis von 3000 Yen oder mehr zu extrahieren. Python-Code:
for book in root.findall('book'):
    price = int(book.find('price').text)
    if price >= 3000:
        title = book.find('title').text
        print(f"Teures Buch: {title} ({price} Yen)")
Durch die Kombination mit if-Anweisungen können so nur Elemente behandelt werden, die einer beliebigen Bedingung entsprechen.

Schreiben in XML-Datei (Speichern)

Es ist auch üblich, geladenes XML zu modifizieren und als neue Datei zu speichern. Beispiel für das Schreiben:
# Erstellen eines neuen Root-Elements
root = ET.Element('users')

# Hinzufügen von Unterelementen
user1 = ET.SubElement(root, 'user', attrib={'id': '1'})
ET.SubElement(user1, 'name').text = 'Sagawa Shōta'
ET.SubElement(user1, 'email').text = 'sagawa@example.com'

# Speichern als Baumstruktur
tree = ET.ElementTree(root)
tree.write('users.xml', encoding='utf-8', xml_declaration=True)
Hiermit wird eine XML-Datei wie folgt generiert:
<?xml version='1.0' encoding='utf-8'?>
<users>
  <user id="1">
    <name>Sagawa Shōta</name>
    <email>sagawa@example.com</email>
  </user>
</users>

Anwendung: Extraktion mit XPath (lxml)

Falls lxml verwendet wird, ist eine flexiblere und mächtigere Suche möglich.
from lxml import etree

tree = etree.parse('books.xml')
titles = tree.xpath('//book[price >= 3000]/title/text()')

for title in titles:
    print(f"Titel des teuren Buches: {title}")
Durch die Nutzung von XPath können Daten auch bei komplexen Bedingungen intuitiv extrahiert werden.
年収訴求

5. Häufige Fehler und Lösungen

Beim Einlesen von XML in Python können verschiedene Fehler auftreten, wie Syntaxfehler oder Probleme mit der Zeichenkodierung. In diesem Abschnitt stellen wir typische Fehler vor, an denen Anfänger leicht stolpern, und deren Lösungen.

UnicodeDecodeError: Leseversagen aufgrund unterschiedlicher Zeichenkodierungen

Fehlerinhalt:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 10
Ursache: Wenn die XML-Datei in einer anderen Zeichenkodierung als UTF-8 (z. B. Shift_JIS oder UTF-16) gespeichert ist, kann Python sie nicht korrekt dekodieren und es tritt ein Fehler auf. Lösung: Geben Sie beim Einlesen der Datei explizit die Kodierung an.
with open('sample.xml', encoding='shift_jis') as f:
    data = f.read()

import xml.etree.ElementTree as ET
root = ET.fromstring(data)
Oder Sie können ElementTree.parse() direkt im Binärmodus übergeben, was ebenfalls wirksam ist.

ParseError: Ungültige XML-Syntax

Fehlerinhalt:
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 3, column 15
Ursache: Dieser Fehler tritt auf, wenn Tags in der XML-Datei nicht geschlossen sind, Sonderzeichen (z. B. &) nicht escaped sind oder Syntaxfehler vorliegen. Lösung:
  • Identifizieren Sie die entsprechende Zeilennummer und Spalte aus der Fehlermeldung
  • Überprüfen Sie Syntaxfehler durch formatierte Anzeige des XMLs im Editor
  • Führen Sie die Umwandlung spezieller Zeichen durch (z. B. &&amp;)
Beispiel: Falsches XML
<note>
  <text>5 & 3</text>
</note>
Nach der Korrektur:
<note>
  <text>5 &amp; 3</text>
</note>

NoneType Attribute Error: Zugriff auf nicht existierende Elemente

Fehlerinhalt:
AttributeError: 'NoneType' object has no attribute 'text'
Ursache: Wenn das angegebene Tag nicht in der XML vorhanden ist, gibt find() None zurück, und der Zugriff auf .text führt zu einem Fehler. Lösung: Überprüfen Sie, ob das Element existiert, bevor Sie den Wert abrufen.
title_elem = book.find('title')
if title_elem is not None:
    title = title_elem.text
else:
    title = 'Titel unbekannt'
Oder ab Python 3.8 können Sie den Walrus-Operator (:=) verwenden, um es knapper zu schreiben.
if (title_elem := book.find('title')) is not None:
    print(title_elem.text)

XML-Datei ist beschädigt oder leer

Symptome:
  • Kein Fehler, aber getroot() gibt None zurück
  • findall() liefert nichts
Ursachen:
  • Die XML-Datei ist leer (0 Bytes)
  • Die Daten sind unvollständig (z. B. Download-Fehler)
Lösungen:
  • Überprüfen Sie Dateigröße und Inhalt
  • Führen Sie einen Syntax-Check mit einem XML-Validierungstool durch
  • Überprüfen Sie den Download- oder Generierungsprozess

6. Häufig gestellte Fragen (FAQ)

In diesem Abschnitt erklären wir in Q&A-Form die häufigen Fragen und Bedenken von Lesern, die sich fragen: „Wie lade ich XML in Python?“ klar und verständlich. Der Inhalt ist so gestaltet, dass er Punkte vorab klärt, an denen man in der Praxis oder beim Lernen leicht hängen bleibt.

Q1. Wie sollte ich die Kodierung (Zeichensatz) von XML-Dateien handhaben?

A. In XML-Dateien ist normalerweise am Anfang eine Kodierungsangabe wie die folgende vorhanden:
<?xml version="1.0" encoding="UTF-8"?>
Die Python-Module ElementTree und lxml lesen diese Deklaration automatisch, aber wenn die Kodierung beim Öffnen der Datei nicht übereinstimmt, tritt ein Fehler auf. Bei japanischen XML-Dateien kann es Shift_JIS oder EUC-JP sein, daher ist es sicher, die Kodierung explizit wie folgt anzugeben:
with open('sample.xml', encoding='shift_jis') as f:
    data = f.read()
Darüber hinaus ermöglicht lxml eine flexiblere Handhabung der Kodierung.

Q2. Wenn ich eine große XML-Datei verarbeite, kommt es zu Speichermangel. Was soll ich tun?

A. Wenn man eine große XML-Datei auf einmal lädt, wird alles in den Speicher entpackt, was zu langsamer Verarbeitung oder Fehlern führen kann. In solchen Fällen ist es effektiv, einen „iterativen Parser“ zu verwenden, der sequentiell laden kann.
import xml.etree.ElementTree as ET

for event, elem in ET.iterparse('large.xml', events=('end',)):
    if elem.tag == 'book':
        print(elem.find('title').text)
        elem.clear()  # Speicher freigeben
Mit dieser Methode kann man nur die benötigten Teile sequentiell verarbeiten und Speicher sparen.

Q3. Welche Vorteile hat die Verwendung von XML statt JSON?

A. Heutzutage verwenden viele APIs JSON, aber XML hat seine eigenen Stärken.
  • Hierarchische Strukturen können streng definiert werden (DTD/XSD usw.)
  • Unterscheidung zwischen Attributen und Elementen möglich
  • Stark dokumentenorientiert, geeignet für Konfigurationsdateien und Strukturinformationen
  • In Unternehmens- und Behördensystemen ist XML immer noch Standard
Zusammengefasst ist XML gut darin, strukturierte Dokumente zu definieren, weniger für das Lesen durch Menschen. Je nach Anwendung bleibt es weiterhin relevant.

Q4. Sollte ich lxml oder ElementTree verwenden?

A. Es ist gut, nach den folgenden Kriterien zu unterscheiden:
BibliothekGeeignete Fälle
ElementTreeKleine bis mittelgroße XML, wenn die Standardbibliothek ausreicht
lxmlWenn XPath benötigt wird, schnelle Verarbeitung, große Datenmengen
Für Anfänger wird ElementTree empfohlen, aber für flexible Extraktion mit XPath oder wenn Geschwindigkeit gefordert ist, ist lxml mächtig.

7. Zusammenfassung

In diesem Artikel haben wir die Methode „XML in Python zu lesen“ für Anfänger verständlich und für die Praxis anwendbar erläutert.

Das Lesen von XML in Python ist überraschend einfach

Mit der Standardbibliothek xml.etree.ElementTree können Sie XML ohne besondere Vorbereitung sofort einlesen. Sobald Sie die grundlegenden Syntax und Methoden (parse(), find(), findall() usw.) beherrschen, wird das Abrufen und Verarbeiten von Daten einfach.

Die Auswahl der Bibliothek je nach Anwendungsfall ist wichtig

  • Für kleine, einfache Verarbeitungen: ElementTree
  • Für detaillierte Knotenoperationen oder formatierte Ausgabe: minidom
  • Für schnelle Verarbeitung oder XPath-Suche: lxml
Jede hat Vor- und Nachteile, daher sollten Sie je nach Größe und Zweck des zu bearbeitenden XMLs auswählen.

Seien Sie auch auf häufige Fehler und Probleme vorbereitet

Fehler, an denen Anfänger leicht scheitern, verursachen keine Panik, wenn man die Ursachen und Lösungen versteht. Insbesondere „Unterschiede in der Zeichenkodierung“, „Syntaxfehler“ und „Überprüfung der Existenz von Elementen“ treten häufig auf.

XML ist immer noch eine aktive Technologie

In den letzten Jahren hat die Nutzung von JSON zugenommen, aber XML wird immer noch in vielen Geschäfts-Systemen, Behörden und bei Datenaustausch verwendet. Die Fähigkeit, XML mit Python zu verarbeiten, ist eine Fähigkeit, die in vielen Bereichen nützlich ist.