Grundlagen XML



[ Informatik-Seminar 2002 ] ... [ Thema XML-Validierung mit Haskell ] ... [ Klassische Validierung ] ...

Übersicht:


Einführung

Die eXtensible Markup Language (XML) ist seit Anfang 1998 vom World Wide Web Consortium (W3C) standardisiert. Sie bildet eine Untermenge der Structured Generalized Markup Language (SGML), welche eine äußerst leistungsfähige, aber auch komplizierte Sprache zur Definition von Auszeichnungssprachen darstellt. XML ist wie SGML eine Metasprache zur Definition eigener Auszeichnungssprachen (Markup Languages).
XML-Dokumente sind hierarchisch strukturiert. Den Dokumenten liegt ein einfaches Datenmodell - Bäume mit ein wenig zusätzlicher Struktur - zu Grunde. Bäume als Verallgemeinerung von Listenstrukturen lassen sich besonders leicht mit Sprachen wie Haskell verarbeiten. Der Datentyp Liste ist integraler Bestandteil dieser Sprache.
Mit einer Document Type Definition (DTD) können formale Anforderungen an die Struktur eines XML-Dokuments definiert werden.
XML wird heutzutage meistens dazu verwendet, Datenstrukturen anwendungsunabhängig zu definieren und auszutauschen. Eine zentrale Rolle spielt die Überprüfung, ob die Dokumente den Regeln einer DTD entsprechen. Die Aufgabe der Überprüfung liegt beim XML-Parser, welcher Dokumente einliest und einer verarbeitenden Anwendung zur Verfügung stellt.
Ziel dieses Seminars ist es, Wege aufzuzeigen, wie diese Überprüfung mit Hilfe der rein funktionalen Programmiersprache Haskell durchgeführt werden kann.

Beispiel einer XML-Dokumentinstanz:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE buch SYSTEM "buch.dtd">

<buch verlag="O'Reilly">
  <kapitel type="n/a">
	 <ueberschrift>Vorwort</ueberschrift>
	 <absatz>...</absatz>
  </kapitel>

  <kapitel type="xml">
	 <ueberschrift>XML Terminologie</ueberschrift>
	 <absatz>...</absatz>
  </kapitel>

  <kapitel type="java">
	 <ueberschrift>Java Referenz</ueberschrift>
	 <absatz>...</absatz>
  </kapitel>
</buch>

Element-Deklarationen der DTD
Attribut-Deklarationen der DTD


Korrektheit von Dokumenten

XML besitzt zwei Klassen der Korrektheit von Dokumenten. Die erste Klasse bilden die wohlgeformten Dokumente. Diese Dokumente halten die Syntax von XML ein. Aufbauend darauf existieren die gültigen Dokumente, welche zusätzlich den Regeln einer vorgegebenen DTD entsprechen.

1. Wohlgeformtheit (well-formed)
Das Dokument hält die Syntax-Regeln von XML ein: 2. Gültigkeit (valid)
Damit ein XML-Parser überprüfen kann, ob ein Dokument nicht nur wohlgeformt, sondern auch gültig ist, kann zu jedem XML-Dokument eine Dokument Type Deklaration (DTD) angegeben werden. Diese wird durch das Schlüsselwort DOCTYPE eingebunden. Hinter dem Namen des Wurzelknotens folgt die Angabe SYSTEM, danach folgt der Universal Resource Identifier (URI) der DTD.


Definition der Dokumentstruktur mit DTDs

Eine DTD beschreibt eine kontextfreien Grammatik, die festlegt, welchen Inhalt ein Element haben darf. Die Syntax ähnelt der von regulären Ausdrücken. Ein Dokument, welches wohlgeformt ist und dessen Struktur einer DTD entspricht, heißt gültiges XML-Dokument.
Eine DTD kann innerhalb eines XML Dokuments definiert werden oder in einer externen Datei. Mit Hilfe der zweiten Methode ist es möglich, die erlaubten Elemente, Attribute und Elementschachtelungen unabhängig von den Daten zu deklarieren.
Die Deklarationen der Elemente und Attribute sind die beiden wichtigsten Konzepte in DTDs. Daneben existieren Parameterentitäten, allgemeine Entitäten, Notationen und Include- Ignore-Sektionen, welche in diesem Seminar jedoch keine weitere Betrachtung finden sollen.

DTDs sind der traditionelle Weg zur Definition der Dokumentstruktur. Sie haben jedoch einige deutliche Nachteile gegenüber gängigen Schemasprachen, was daran liegt, dass sie nicht für die allgemeine Datenbeschreibung gedacht sind, sondern aus der dokumentenzentrierten Sicht von SGML stammen. DTDs besitzen eine eigene nicht XML konforme Syntax und unterstützen Datentypen nur im geringen Umfang. Das W3C hat deshalb den XML Schema Standard entwickelt, der seit Mai 2001 als stabiler Standard gilt. Die Vorteile von XML Schema liegen darin, dass es über ein anspruchsvolles Datentypkonzept verfügt, so dass Datentypen (wie Integer, Float, Date, Time, ...) verwendet werden können. XML Schema unterstützt außerdem leistungsfähige Strukturierungsmechanismen, mit denen Elementtypen voneinander abgeleitet werden können, wie man es aus anderen Modellierungsansätzen kennt. In diesem Seminar soll jedoch nur die Validierung von XML-Dokumenten gegen DTDs betrachtet werden.




Analogie XML zu OO-Sprachen




Syntax von DTDs

1. Element Deklaration

Eine DTD muss für alle in einem Dokument zulässigen Elemente eine <!ELEMENT>-Deklaration enthalten. Diese Deklaration gibt den Namen des Elements und dessen Inhaltsmodell (content-modell) an. Es darf jeweils nur eine Deklaration für ein Element geben. Mehrere Deklarationen mit dem gleichen Elementnamen sind nicht gestattet. Es spielt keine Rolle, in welcher Reihenfolge die Elemente deklariert werden.

<!ELEMENT name Inhaltsmodell>

Operatoren für das Inhaltsmodell:
Um das Inhaltsmodell eines Elements zu beschreiben existieren einige Operatoren. Diese werden im folgenden Abschnitt kurz vorgestellt.

Konnektoren:
, "then" Folge von Elementen
| "xor" Alternative von Elementen (exklusiv)

Häufigkeits Indikatoren:
(kein Indikator) Element muss genau einmal auftreten
? Element ist optional, 0 oder 1
* Element ist optional und wiederholbar, 0 oder beliebig oft
+ Element muss vorhanden sein, kann öfter auftreten, 1 oder beliebig oft

Gruppierung:
( Start Inhaltsmodell oder Gruppe
) Ende Inhaltsmodell oder Gruppe

#PCDATA im Inhaltsmodell
#PCDATA steht für parsed character data und bedeutet, dass diese Textdaten vom XML-Parser auf eventuelles Markup hin untersucht werden. Falls Entity-Referenzen enthalten sind, werden diese ersetzt.
(#PCDATA) Element besitzt nur Textdaten als Inhalt, ggf. keinen Inhalt
(#PCDATA | elem1 | elem2)* Mixed content. Das Element kann Textdaten und Elemente enthalten. #PCDATA muss in der Deklaration als erstes aufgeführt werden. Es lässt sich nicht festlegen, dass die erlaubten Kind-Elemente in einer vorgegebenen Reihenfolge im Text erscheinen müssen, oder dass sie überhaupt auftreten müssen.

Schlüsselworte
EMPTY Element besitzt keinen Inhalt
ANY Element besitzt beliebige deklarierte Elemente und Textdaten, oder keinen Inhalt

Beispiel:

Element-Deklarationen für das obige XML-Dokument.

<!ELEMENT buch         (kapitel+)              >
<!ELEMENT kapitel      (ueberschrift, absatz+) >
<!ELEMENT ueberschrift (#PCDATA)               >
<!ELEMENT absatz       (#PCDATA)               >



2. Attribut Deklaration

Eine DTD legt neben den Elementen auch deren zulässige Attribute mit deren Typen und Default-Werten fest. Die Deklaration der Attribute geschieht durch das Schlüsselwort <!ATTLIST>.

<!ATTLIST target_element   attr_name   attr_type   default>
Typ des Attribut Werts:
CDATA Textdaten
(a | b | c) Liste von möglichen Attribut Werten
ID Unique identifier
Wert des Attributes muss im Dokument eindeutig sein
IDREF Referenz auf eine ID eines anderen Elements
IDREFS Ein oder mehrere IDREFs, getrennt durch Leerzeichen
NMTOKEN / NMTOKENS Name token (nicht weiter betrachtet)
ENTITY / ENTITIES Name eines Entities, welches an anderer Stelle deklariert ist (nicht weiter betrachtet)

Attribut Defaults:
"wert" Default Wert des Attributes
Wenn das Attribut nicht angegeben ist, wird dieser Wert verwendet
#REQUIRED Attribut muss angegeben werden
#IMPLIED Attribut ist optional
#FIXED "wert" Attribut besitzt einen festen Wert. Es darf kein anderer Wert im Dokumente angegeben werden.

Beispiel:

Attribut-Deklarationen für das obige XML-Dokument.

<!ATTLIST buch      verlag    CDATA               #REQUIRED>
<!ATTLIST kapitel   type      (n/a | xml | java)  #IMPLIED>


[ Informatik-Seminar 2002 ] ... [ Thema XML-Validierung mit Haskell ] ... [ Grundlagen XML ] ... [ Klassische Validierung ] ...