目次
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
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)
Ad
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 mitElementTree 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 YenSo 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 mitET.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)
- 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 lxmlGrundlegende 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
- Installation einer externen Bibliothek erforderlich
- Etwas anfängliches Lernen erforderlich (z. B. XPath)
Zusammenfassung der Auswahl der Bibliothek
| Bibliothek | Merkmale | Geeignete Fälle |
|---|---|---|
| ElementTree | Standardmäßig verfügbar, grundlegende Lese- und Schreibvorgänge möglich | Laden kleiner bis mittelgroßer XML |
| minidom | Stark in DOM-Operationen, gut in formatierter Ausgabe | Wenn detaillierte Manipulation der Knotenstruktur gewünscht |
| lxml | Schnell, XPath-kompatibel, hohe Flexibilität | Bei großen Daten, wenn fortgeschrittene Suche benötigt wird |

Ad
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)
Fallslxml 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 10Ursache: 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 15Ursache: 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.
&→&)
<note>
<text>5 & 3</text>
</note>Nach der Korrektur:<note>
<text>5 & 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()gibtNonezurück findall()liefert nichts
- Die XML-Datei ist leer (0 Bytes)
- Die Daten sind unvollständig (z. B. Download-Fehler)
- Ü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
Ad
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 freigebenMit 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
Q4. Sollte ich lxml oder ElementTree verwenden?
A. Es ist gut, nach den folgenden Kriterien zu unterscheiden:| Bibliothek | Geeignete Fälle |
|---|---|
| ElementTree | Kleine bis mittelgroße XML, wenn die Standardbibliothek ausreicht |
| lxml | Wenn XPath benötigt wird, schnelle Verarbeitung, große Datenmengen |
ElementTree empfohlen, aber für flexible Extraktion mit XPath oder wenn Geschwindigkeit gefordert ist, ist lxml mächtig.Ad
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 Standardbibliothekxml.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




![[Für Anfänger] Python-Paketverwaltung gründlich erklärt | pip, venv und Poetry im Vergleich](https://www.python.digibeatrix.com/wp-content/uploads/2025/04/3fa5b4491c4aa8c480a7ced782fca561-375x214.webp)