Ein Blog über Code, Hardware und Co

Programmieren und Entwickeln

XML-Verarbeitung mit Python 3 und lxml

Oder: Effizientes XML-Parsing mit Python

Die universelle Skriptsprache Python¹ ist auf allen Plattformen präsent. XML²-Dialekte finden sich zusammen mit JSON auf dem ersten Platz universeller, offener Datenformate.

Das Zusammenwirken von Python und XML gibt Softwaredesign- und Entwicklung ein mächtiges Toolset zu Schaffung und Verwaltung von investitionssicherer Software-Infrastrukturen und Assets an die Hand.

Was ist XML und wie ist es entstanden?

Das Markup-Format **XML** hat sich in dem Vierteljahrhundert seit seiner Standardisierung durch das World Wide Web Konsortium im Jahr 1996 einen prominenten Platz in der Riege offener Datenformate erobert.

Textverarbeitungen und Tabellenkalkulationen bieten ergänzend zu nativen Lösungen offene, XML-basierte Persistenzformate an. Datenbanksysteme wie Oracle und PostgreSQL haben XML-Formate und Schnittstellen implementiert. Der COLLADA-Standard der Kronos Group zum Austausch von 3D-Assets ist ein XML-Dialekt.

Über die Datendarstellung hinaus existieren Anwendungen als ein verbessertes HTML (XHTML), zum Austausch von RPC-Nachrichten und Schnittstelleninformationen (SOAP/WSDL) und mit XSL Tranformationen – in doppelter Anwendung – zur Generierung von Dokumenten beliebiger Textformate aus anderen XML-Assets und SQL-Resultsets in XML-Form.

Was ist Python und wie ist es entstanden?

Die frei verfügbare Skriptsprache **Python** ist gleichfalls ein Kind der 1990er Jahre. Guido van Rossum erfand die Sprache im Jahr 1991 als eine multi-paradigmatische Sprache, die die Paradigmen der objektorientierten und das der stukturierten Programmierung unterstützt – es gibt in Python keine Notwendigkeit, Funktionen oder gar das Analogon zum C/C++ “main()” als Klassen- oder Objektmethoden auszulegen.

Darüberhinaus lassen sich mit Python die Paradigmata der generischen (Meta-) und der Aspektorientierten Programmierung. Die umfangreiche Klassenbibliothek, die Bestandteil der Python-Distribution ist, macht Python out of the box zu einem vielseitigen Werkzeug für Einsatzgebiete in der Bandbreite zwischen der Automatisierung täglicher Routineaufgaben und anspruchsvollen technisch/wissenschaftlichen Programmieraufgaben.

Mit den freien Erweiterungen numpy und scipy hat Python Einzug in das naturwissenschaftliche Rechnen gefunden. Das Python-Konzept der Integration von binären Erweiterungsmodulen – in diesem Fall von Modulen, die in Fortran und C geschrieben und kompiliert wurden – führt beim wissenschaftlichen Rechnen mit Python zu Performanz an den entscheidenden Stellen wie Eigenwertsuche, der Lösung linearer Gleichungssysteme und der Invertierung von Matrizen.

Mit seinem Leistungsspektrum steht Python in direkter Konkurrenz sowohl zu Shell-Skriptsprachen als auch zu höheren Programmiersprachen wie Fortran, Java und C/C++.

XML + Python

Die Python-Distribution enthält die folgenden Module:

  • xml.dom.
  • xml.sax
  • xml.etree
  • xml.parsers.expat

Für viele Anwendungsbereiche genügt diese XML-Unterstützung.

Für fortgeschrittene XML-Anwendungen benötigt man XPath-Support, der über das Subset, das die aktuelle Python-3-Distribution bietet, hinausgeht. In der offiziellen Python-Dokumentation findet sich unter https://docs.python.org/3/library/xml.etree.elementtree.html#xpath-support der einschränkende Hinweis:

“XPath support
This module provides limited support for XPath expressions for locating elements in a tree. The goal is to support a small subset of the abbreviated syntax; a full XPath engine is outside the scope of the module.”

Auf der Suche nach Alternativen und Ergänzungen wird man bei der ebenfalls freien Python-Bibliothek lxml² fündig.

Namespaces

Der Smoketest jeder XML-Bibliothek aus Programmierersicht ist die Behandlung von XML-Namensräumen (namespaces). Diese werden durch Präfixe materialisiert, die den Tags ihres Namensraumes durch Doppelpunkte getrennt vorangestellt werden.
Ein bekanntes Beispiel für Namensräume sind SVG-Grafikdateien.

Dieses SVG-Snippet

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="1920" height="1080" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- [...] -->
</svg>

definiert zwei Namensräume, “svg” und “xlink”. Bei der Instanziierung eines SVG-Rechtecks (rect) im Korpus dieser Datei würde “rect” das Präfix “svg” vorangestellt:

<svg:rect width=”800″ height=600/>.

Die Behandlung solcher Namensräume wird von lxml mit einem Python-Dictonary geleistet:

SVG_NAMESPACE = 'http://www.w3.org/2000/svg'
SVG = "{%s}" % SVG_NAMESPACE
XLINK_NAMESPACE = 'http://www.w3.org/1999/xlink'
XLINK = "{%s}" % XLINK_NAMESPACE

NAMESPACE_MAP = {
"svg" : SVG_NAMESPACE,
"xlink": XLINK_NAMESPACE
}

Dieses Dictionary kann in Ausdrücken über das benannte Argument “nsmap” genutzt werden:

from lxml import etree as ET
#
# [...]
#
rect = ET.Element(SVG + "rect", nsmap=NAMESPACE_MAP)

Nach der Konstruktion werden die Attribute gesetzt:

rect.set("width", "800")
rect.set("height", "600")

XSLT

Das XSLT-Stylesheet wird über die gleichen API-Rufe geladen wie das zu transformierende XML-Dokument:

ta_tree = ET.parse("data.xml")
xslt_tree = ET.parse("mystyle.xslt")

Dann wird der Baum des Stylesheets zur Konstruktion eines Transformators genutzt:

transform = ET.XSLT(xslt_tree)

Schließlich wird transformiert:

result_tree = transform(data_tree)

Und das war es schon. Nur vier API-Aufrufe für eine komplette XSLT-Transformation. Einfacher und intuitiver in der Schnittstelle geht es nicht. Das ist die Einfachheit, die man von Python gewohnt ist, beibehalten für die Verarbeitung von XML-Strukturen.

Fazit

Die Verfasser/-innen dieses Beitrags haben noch kein Problem zur XML-Verarbeitung angetroffen, das sich mit der Kombination aus Python 3 und lxml hätte lösen lassen.

Die Verarbeitung von XML mittels Python 3 und der freien Zusatzbibliothek lxml eröffnet die Mächtigkeit offener, validierbarer Datenformate der als intuitiv bekannten Programmierung mit Python 3.


Links
¹ https://www.python.org/
² https://www.w3.org/XML/
³ https://lxml.de

Schreibe eine Antwort