57. XML I

XML (Extensible Markup Language) ist eine Familie von formalen Sprachen, die mittlerweile für alle möglichen Anwendungen benutzt wird. Beispiele sind XHTML, RDF oder sogar die neuesten Dateiformate von Microsoft-Programmen.

XML schreibt eine Syntax vor, aber (fast) keine Semantik – jedes Programm, das XML lesen kann, könnte im Prinzip Daten jedes anderen XML-erzeugenden Programmes lesen. Es wird aber in der Regel nichts damit anfangen können.

Die Syntax beschreibt im Prinzip die von kontextfreien Sprachen. Damit ist die Struktur eines XML-Dokumentes letztlich auch immer die eines Baumes.

XML-Dokumente bestehen im (ganz) Groben aus Elementen, die sich wiederum aus einem öffnenden Tag (etwas wie <el>), ggf. mit Attributen, eventuell einem Inhalt (andere Elemente oder Daten) und einem schließenden Tag (etwas wie </el>) zusammensetzen. Die Wahrheit ist erheblich komplizierter. Ein Beispiel:

<sp who="Faust" desc=’leise’ xml:lang="de">
  <l>Habe nun, ach! Philosophie,</l>
  <l>Juristerei, und Medizin</l>
  <l>und leider auch Theologie</l>
  <l>durchaus studiert mit heißem Bemüh’n.</l>
</sp>

Wir haben ein Element sp, das offenbar eine Äußerung eines Theatercharakters repräsentieren soll. Im öffnenden Tag sind drei Attribute gegeben, nämlich who, das eine Angabe macht, wer spricht, desc, das eine Art Regieanweisung gibt, und xml:lang, das die Sprache angibt, in der die Äußerung getätigt wird. Attribute sind Schlüssel-Wert-Paare, in denen die Schlüssel aus Buchstaben bestehen (der : spielt eine spezielle Rolle, die etwa der des Punktes in Python entspricht – er trennt Namespaces –, aber das ist eher ein Thema für eine XML-Veranstaltung), die Werte aber Strings sind (sowohl einfache als auch doppelte Anführungszeichen sind erlaubt). Die einzelnen Schlüssel-Wert-Paare sind durch Whitespace getrennt.

Der Inhalt dieses sp-Elements besteht aus vier weiteren Elementen, deren jedes wieder Zeichen enthält.

Übrigens regelt XML auch, dass es immer genau ein Wurzelelement gibt, damit wir auch wirklich einen Baum haben.

Nochmal: Welche Elemente mit welchen zulässigen Unterelementen es gibt, wird von XML nicht festgelegt, das hängt von der Anwendung ab. XML legt nur fest, wie Tags aussehen und wie Attribute.

Ein „richtiges” XML-Dokument enthält in der Regel noch weitere Angaben, etwa zum Encoding und wie ein Programm prüfen kann, ob die einzelnen Elemente auch am richtigen Platz sind. Diese Fragen sind nicht Gegenstand dieser Veranstaltung, bei Bedarf könnt ihr euch bei xmlfiles oder in einem der Bücher in der entsprechenden Sektion unseres Literaturverzeichnisses umsehen.

Um XML-Eingaben zu verarbeiten, könnte man versucht sein, es mit Regulären Ausdrücken zu versuchen.

Das funktioniert aber nicht so einfach, weil XML-Anwendungen nicht regulär sind (sie sind normalerweise kontextfrei). Darüber hinaus hat XML jede Menge Feinheiten, die das Schreiben eines korrekten XML-Parsers schwierig machen.

„When in doubt, steal code”: Es gibt fertige XML-Parser samt Schnittstellen zu Python. Je nach Anwendungsfall kann man eine von zwei Schnittstellen im Basis-Python wählen:

  • SAX – eine „ereignisorientierte” Schnittstelle in xml.sax
  • DOM – eine Schnittstelle, die ein XML-Dokument als Baum liefert, in xml.dom oder xml.dom.minidom

Das „eine von zwei” ist natürlich dreist gelogen. Es gibt einen Haufen Schnittstellen zu XML, unter anderem auch Frederik Lundhs ElementTree, das deutlich pythonesker ist SAX oder DOM, die beide „sprachübergreifend” definiert sind. SAX und DOM wollen wir uns hier aber gerade wegen ihrer sprachübergreifenden Natur ansehen.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Macht euch kundig, wo überall in der Computerlinguistik XML en vogue ist. Sucht insbesondere nach Informationen über das Resource Desription Format RDF.


Markus Demleitner

Copyright Notice