UNIVERSITÄT GIESSEN
Institut für Informatik
Dr. Stefan Brass
<?xml version="1.0"?>
<!-- Kommentar: Einige Bücher zur XML-Definition -->
<?xml-stylesheet type="text/xsl" href="books_ie.xsl"?>
<BOOKLIST>
<BOOK ISBN="0-13-014714-1" PAGES="1074">
<AUTHOR FIRST="Paul" LAST="Prescod"/>
<AUTHOR FIRST="Charles" MI="F." LAST="Goldfarb"/>
<TITLE>The XML Handbook - 2nd Edition</TITLE>
<PUBL YEAR="1999" MO="11">Prentice Hall</PUBL>
<NOTE>Contains CD.</TITLE>
</BOOK>
<BOOK ISBN="1-56592-709-5" PAGES="107">
<AUTHOR FIRST="Robert" LAST="Eckstein"/>
<TITLE>XML Pocket Reference</TITLE>
<PUBL YEAR="1999" MO="10">O'Reilly</PUBL>
</BOOK>
<BOOK ISBN="0-13-082676-6" PAGES="368">
<AUTHOR FIRST="Bob" LAST="DuCharme"/>
<TITLE>XML: The Annotated Specification</TITLE>
<PUBL YEAR="1998" MO="12" >Prentice Hall</PUBL>
</BOOK>
</BOOKLIST>
Diese Datei steht unter der URL [http://www.informatik.uni-giessen.de/staff/brass/xml00/books1.xml] im Web. Sie verwendet ein Stylesheet, das in Kapitel 7 erläutert wird. Eine Version ohne Stylesheet ist unter [http://www.informatik.uni-giessen.de/staff/brass/xml00/books0.xml] verfügbar. Der Internet Explorer zeigt dann die Baumstruktur (s.u.) an, mit der Möglichkeit, Teilbäume auszublenden oder anzuzeigen.
Kontextfreie Grammatiken sind ein wichtiges Werkzeug für Informatiker. Ich wundere mich, wenn ein Buch, das sich ``Referenz`` nennt, nicht die Grammatik für XML enthält. Ich hatte, nachdem ich eine XML Definition in Prosa gelesen hatte, durchaus noch einige Fragen, die sich nur anhand der Grammatik klären ließen. Die Grammatik hat insbesamt 89 Produktionen und die ganze XML Spezifikation hat 36 Seiten.
Zum Beispiel reicht die Wohlgeformtheit aus, ein Stylesheet anzuwenden, aber man wird nicht das gewünschte Ergebnis bekommen, wenn das Eingabedokument nicht der Grammatik genügt, die bei der Entwicklung des Stylesheets angenommen wurde.
Tatsächlich muß auch ein non-validating Parser die syntaktische Korrektheit der DTD-Teilmenge im Dokument selbst prüfen, und auch dort definierte Entities, Default-Werte von Attributen etc. berücksichtigen. Es ist also nicht ganz richtig, daß die DTD völlig ignoriert werden kann. Bestimmte syntaktische Komplikationen sind aber nur in externen DTDs erlaubt, die ignoriert werden können. Die Syntax-Regeln, die die DTD vorschreibt, brauchen auch nicht im Dokument geprüft zu werden.
Die Anforderungen für ``well-formed'' und ``valid'' XML sind dadurch geregelt, daß zwar beide die gleiche kontext-freie Grammatik verwenden, aber bei den (kontext-sensitiven) Zusatz-Bedingungen zwischen ``well-formedness constraints'' (muß jedes XML Dokument erfüllen) und ``validity constraints'' (müssen nur ``valid'' XML-Dokumente erfüllen) unterschieden wird.
Zum Beispiel sind Escape und BEL nicht erlaubt. Der Unicode-Standard wurde von einer Gruppe von Computer-Herstellern entwickelt (z.B. IBM, HP, ORACLE, Microsoft, Apple, SUN), um Zeichen einheitlich mit 16 Bits zu repräsentieren [http://www.unicode.org]. Der Unicode Standard stimmt mit der UCS-2/UTF-16 (2 Byte) Variante des ISO/IEC 10646 Standards überein. Beide Komitees arbeiten zusammen, um zu verhindern, daß die beiden Standards auseinanderlaufen.
UTF-8 arbeitet mit einem Byte für Zeichen mit Nummer bis 127 (#x007F), zwei Byte für Zeichen mit Nummer zwischen 128 und 2047 (#x07FF), drei Byte für Zeichen mit Nummer zwischen 2048 und 65535 (#xFFFF), und vier Bytes für ``Surrogates'' (bisher nicht benutzt). UTF-16 verwendet zwei Byte für jedes Zeichen (und vier Bytes für ``Surrogate Pairs'').
UTF-16 Dokumente müssen mit #xFEFF beginnen, und können so von UTF-8 Dokumenten unterschieden werden. Der XML Standard erklärt im Anhang F (``Autodetection of Character Encodings''), wie verschiedene Codierungen erkannt werden können. Der Standard schreibt vor, daß, sofern nicht UTF-8 oder UTF-16 verwendet werden, die ersten Zeichen <?xml ...?> sein müssen. Weiß man, wie diese Zeichen in verschiedenen Codierungen aussehen, so kann man genug erkennen, um die Codierungs-Deklaration zu verstehen, die in dieser XML-Deklaration enthalten sein muß.
Will man z.B. mit ISO Latin 8859/1 arbeiten, so schreibt man ganz am Anfang des Dokumentes: <?xml version="1.0" encoding="ISO-8859-1"?>. Allerdings kann es sein, daß ein XML-Prozessor diese Codierung nicht kennt und das Dokument zurückweist.
Wenn man nicht auf einem IBM Großrechner mit EBCDIC arbeitet.
Unicode von den Zeichencodes her auch eine Obermenge von ISO Latin 8859/1. Das nützt allerdings nicht viel, da die UTF-8 Codierung nicht kompatibel ist: Umlaute werden mit zwei Bytes dargestellt, da ihr Code größer als 127 ist. In der Ausgabe erscheinen dann zwei merkwürdige Zeichen für jeden Umlaut (wenn das Terminal nicht Unicode-kompatibel ist). Die 2-Byte Codierung von UTF-8 kann bis zu 11 Bits darstellen: Das erste Byte startet mit den Bits ``110'' und enthält dann die höherwertigen 5 Bits der Unicode-Nummer, das zweite Byte startet mit den Bits ``10'' und enthält dann die niederwertigen 6 Bits der Unicode-Nummer. Die 3-Byte Codierung kann dann alle 16 Bits darstellen: Das erste Byte startet mit ``1110'' gefolgt von den 4 höchstwertigen Bits der Unicode-Nummer, dann folgen zwei Bytes, die beide mit ``10'' beginnen und jeweils 6 Bits enthalten.
``Combining Characters'' und ``Extenders'' im Sinne des Unicode Standards sind auch erlaubt, nur nicht als erste Zeichen. Der Anhang B des XML Standards enthält eine lange Liste der Unicode-Bereiche, die als Buchstaben etc. gelten. Die deutschen Umlaute gehören natürlich dazu.
Das bedeutet, man kann Namen, die mit ``xml'' beginnen, nicht für selbst-definierte Tags und Attribute verwenden. Der XML-Standard und der Namespace-Standard legen zum Beispiel eine bestimmte Bedeutung für die Attribute ``xml:space'', ``xml:lang'' und ``xmlns:...'' fest.
D.h. eine Teilmenge der bezüglich des XML-Standards erlaubten XML-Dokumente sind auch bezüglich des Namespace Standards erlaubt. Z.B. kann es nach dem Namespace Standard maximal einen Doppelpunkt in einem Namen geben, und der Teil vor dem Doppelpunkt muß als Kürzel für einen Namespace deklariert sein.
Außerdem gibt es noch Entity-Referenzen, Zeichen-Referenzen, Kommentare, Begrenzungen von CDATA Abschnitten, Document Type Deklarationen, und Processing Instructions.
In HTML werden dagegen Tags wie etwa <BR> und <IMG> typischerweise ohne schließende Tags verwendet. Dazu muß der Browser aber wissen, daß diese Tags keinen Inhalt haben können. SGML hat recht komplizierte Regeln zur Rekonstruktion weggelassender schließender Tags. Zum Beispiel muß ein Browser auch wissen, daß <LI> nicht direkt geschachtelt werden kann. Wenn er also ein neues ``List Item'' sieht, wird damit automatisch das vorangegangene beendet. XML soll dagegen auch ohne DTD mit beliebigen Tags syntaktisch analysiert werden können. Weil der XML Prozessor also möglicherweise nichts über die Tags weiß, fordert XML, daß jedes geöffnete Tag explizit wieder geschlossen wird.
Wenn man mit älteren SGML-Systemen kompatibel sein will, sollte man diese Abkürzung nur für Elementtypen verwenden, die als EMPTY deklariert sind. Die XML Spezifikation erlaubt es aber ausdrücklich unabhängig von der Definition des Tags, wann immer der Inhalt eines Elementes leer ist.
Dies funktioniert wie Klammern: ([]) wäre eine korrekte Schachtelung, aber ([)] wäre inkorrekt.
Ein Stack ist für Informatiker eine sehr bekannte Datenstruktur. Es ist eine Liste, bei der man nur an einem Ende etwas anfügen oder entnehmen kann, d.h. sie arbeitet nach dem Last-in, First-out Prinzip (LIFO). Wenn man seinen Keller so vollgeräumt hat, daß man an die hinteren Sachen nur drankommt, wenn man die vorderen herausräumt, versteht man, warum es Keller-Speicher heißt. Oft wird auch ein Stapel von Tellern als Modell genommen, wo man nur oben einen Teller drauflegen oder herunternehmen kann. Für Kantinen gibt es auch Vorrichtungen mit einer Feder, bei denen immer genau der oberste Teller herausschaut.
Übungsaufgabe: Führen Sie diese Prüfung an dem Beispiel durch. Geben Sie jeweils ein Beispiel für jede der drei Fehlermöglichkeiten. Diese Beispiele können künstlich sein (mit <A>, <B>, etc.).
Diese Bezeichnung wird hier nicht im Sinne der Mengenlehre verwendet. Man könnte vielleicht auch Objekt, Entity, Molekül etc. sagen, aber Element ist das schon bei SGML verwendete Fachwort.
In der XML-Spezifikation steht es so: ``Each XML Document contains one or more elements, the boundaries of which are either delimited by start-tags and end-tags, or, for empty elements, by an empty-element tag.'' (Anfang von Kapitel 3, [http://www.w3.org/TR/REC-xml#sec-logical-struct]).
Aus der Spezifikation, Anfang von Kapitel 3 [http://www.w3.org/TR/REC-xml#sec-logical-struct]: ``Each element has a type, identified by name, sometimes called its ``generic identifier'' (GI), and may have a set of attribute specifications. ...''
Aus der XML-Spezifikation, Abschnitt 2.1 [http://www.w3.org/TR/REC-xml#sec-well-formed]: ``There is exactly one element, called the root, or document element, no part of which appears in the content of any other element. For all other elements, if the start-tag is in the content of another element, the end-tag is in the content of the same element. More simply stated, the elements, delimited by start- and end-tags, nest properly within each other.''
In der Informatik werden verschiedene Varianten von Bäumen verwendet. Zum Beispiel kann man einen Baum als endlichen gerichteten Graphen definieren, der zyklenfrei ist, und bei dem es einen Knoten gibt, von dem aus alle anderen Knoten erreichbar sind (der Graph ist daher zusammenhängend). Dieser Knoten, vom dem aus alle anderen erreichbar sind, heißt dann Wurzel des Baumes. Wenn es eine Kante von A nach B gibt, heißt B Kind von A. In dieser Sprechweise wäre die Wurzel also der gemeinsame Urahn aller Knoten des Baumes. Für unsere Zwecke reicht diese Definition aber noch nicht aus, wir benötigen zusätzlich für jeden Knoten eine lineare Ordnung auf allen seinen Kindern. Zum Beispiel ist es bei Dokumenten ja wichtig, was das erste, zweite, dritte u.s.w. Kapitel ist. Solche Bäume werden auch geordnete Bäume genannt.
Übungsaufgabe: Was ist die Baumdarstellung für das Beispiel-Dokument?
Aus Abschnitt 2.1 der Spezifikation: [http://www.w3.org/TR/REC-xml#sec-well-formed]: ``As a consequence of this, for each non-root element C in the document, there is another element P in the document such that C is in the content of P, but not in the content of any other element that is in the content of P. P is referred to as parent of C, and C as child of P.''
(Bild an der Tafel, z.B. rechteckige Knoten für Elemente, Punkt-förmige Knoten für Text, Name des Element-Typs im Knoten notiert, Wert des Textes unter dem Knoten notiert, paßt so zum XPath Datenmodell, s.u.)
Wir werden die Baum-Darstellung später noch weiter verfeinern, insbesondere sieht das XPath Datenmodell wie auch das ``Document Object Model'' (DOM) noch einen extra ``Dokument-Knoten'' als Wurzel vor, dessen Kind dann der Element-Knoten des Dokument-Elementes ist. Dies ist nötig, um z.B. Processing Instructions wie das ``xml-stylesheet'', die vor dem Dokument-Element stehen können, im Baum zu erfassen.
Aufgabe: Führen Sie diesen Algorithmus für das Beispiel-Dokument durch.
Zur Kompatibilität mit SGML-Systemen wird empfohlen (``should''), auch diese fünf Entities selbst zu deklarieren.
Außerdem dürfen (s.o) nur graphische (d.h. druckbare) Zeichen des Unicode-Zeichensatzes verwendet werden, plus Leerzeichen, TAB, CR. und LF.
Die zweite Möglichkeit ist natürlich übersichtlicher und daher vorzuziehen. Intern ist sie aber nur eine Abkürzung für die erste Möglichkeit.
Den Beginn des geschachtelten Abschnittes würde XML ignorieren, weil ``<'' im inneren ja gerade keine besondere Bedeutung hat, dafür würde das Ende des geschachtelten Abschnittes dann bereits das Ende des ganzen Abschnittes signalisieren.
Dies wäre für einen XML-Parser eigentlich nicht nötig, aber die XML-Spezifikation verwendet hier ausdrücklich das Wort ``must''.
In der Spezifikation ist die Produktion für ``content'' die einzige Verwendung des Nichtterminal-Symbols ``CDSect'', es steht dort gleichberechtigt u.a. mit ``CharData'' (Text).
<PUBL YEAR="1999" MO="11">
In HTML könnte zum Beispiel die Jahreszahl auch als ``YEAR=1999'' geschrieben werden. Das ist in XML nicht legal.
Zum Beispiel kann man in HTML schreiben: ``<DL compact>''. Schaut man in die HTML Spezifikation, findet man, daß dieses Attribut nur den Wert ``compact'' haben kann. Das heißt, es gibt nur zwei Möglichkeiten: Das Attribut ist für ein Element definiert, und hat dann den vorgegebenen Wert, oder es ist nicht definiert (das Element hat dieses Attribut nicht). In HTML braucht für solche Attribute kein Wert angegeben zu werden, es reicht, den Namen des Attributes anzugeben. In XML besteht eine Attribut-Spezifikation immer aus Name und Wert, man muß also <DL compact="compact"> schreiben. (Tatsächlich sollen einige Browser damit Schwierigkeiten haben, obwohl es in HTML auch legal ist.)
Zwischen dem Element-Typ und Attribut-Angaben sowie zwischen den einzelnen Attribut-Angaben ist Leerplatz (``white space'', Leerzeichen, Tabulator, oder Zeilenende) erforderlich. Zwischen der letzten Attribut-Angabe und dem ``>''-Zeichen ist Leerplatz erlaubt, aber nicht erforderlich. Zwischen dem ``<-Zeichen und dem Element-Typ ist Leerplatz nicht erlaubt. Leerplatz muß nicht aus einem einzigen Zeichen bestehen, sondern kann eine beliebige Folge von Leerzeichen, Tabulatoren, und Zeilenenden sein.
Links und rechts vom Gleichheitszeichen ist Leerplatz erlaubt, aber nicht notwendig.
Die beiden Anführungszeichen müssen aber übereinstimmen, YEAR="1999' wäre ein Syntaxfehler. Verwendet man zur Begrenzung ", so kann der Attribut-Wert ' enthalten und umgekehrt. Soll der Attributwert beide Arten von Anführungszeichen enthalten, so muß man eine Sorte zum Begrenzen der Zeichenkette verwenden, und diese im Inneren der Zeichenkette dann als ' oder " schreiben.
Dadurch kann ein Parser ein eventuell vergessenes Anführungszeichen recht einfach finden.
Bei Bedarf muß man es als & schreiben.
Jedes Element hat eine Menge (ungeordnet) von Attribut-Wert Paaren.
<?xml version="1.0" encoding="ISO-8859-1"?>
Man kann die XML-Deklaration weglassen (wenn keine Codierungs-Deklaration nötig ist), aber wenn eine XML-Deklaration vorhanden ist, muß sie mindestens die XML-Version enthalten. Die minimale XML-Deklaration ist also <?xml version="1.0"?>
Man beachte, daß die Reihenfolge der Klauseln in der XML Deklaration wichtig ist (im Gegensatz zur Reihenfolge von Attributen).
Im wesentlichen ist sie nicht nützlich, weil der Default-Wert ``no'' fast immer richtig ist (und niemals richtig falsch).
Ein XML-Prozessor kann, aber muß nicht, der Anwendung erlauben, auch die Kommentare abzufragen. Der Normalfall sollte wohl sein, daß Kommentare vom Programm einfach überlesen werden.
Manche HTML Browser erlauben dagegen kein Markup in Kommentaren. Zum Beispiel hatte ich einmal einen Kommentar nicht richtig geschlossen, und dennoch wurde alles richtig angezeigt.
Es ist etwas unglücklich, daß Kommentare in XML so viele Zeichen zum Öffnen und Schließen benötigen. Meist schreiben Programmierer ohnehin weniger Kommentar, als es gut wäre. Der Grund ist, daß Kommentare in SGML mit ``--'' geöffnet und geschlossen werden (was nicht zu viele Zeichen sind), aber nur innerhalb von Markup Deklarationen / Dokument Type Definitionen erlaubt sind (sie sind ja auch hauptsächlich dort nötig). In SGML gelangt man mit ``<!'' in den Definitionsmodus und verläßt ihn wieder mit ``>''. HTML und XML Kommentare setzen sich dann aus beidem zusammen.
Moderne Programmiersprachen behandeln Kommentare überlicherweise als äquivalent zu ``Whitespace'', also wie etwa ein Leerzeichen. XML weicht von diesem Muster ab. Kommentare sind nicht überall erlaubt, wo Leerzeichen erlaubt sind. Außerdem scheint es so, als wäre ein Kommentar auch im Inneren eines Wortes erlaubt (?).
Auch schreibt die XML-Grammatik genau vor, wo Leerzeichen (whitespace) erlaubt sind. Bei modernen Programmiersprachen gilt die Regel ``zwischen je zwei Token''. Man muß aber sagen, daß die XML-Grammatik einstufig ist (keine Trennung lexikalischer und kontextfreier Syntax), so daß Token für XML nicht definiert sind.
Wenn man die Spezifikation wörtlich nimmt, wäre ein Kommentar auch ganz am Anfang eines Dokumentes erlaubt. Der Anhang F (``Autodetection of Character Encodings'') geht aber davon aus, daß die XML-Definition am Anfang stehen muß.
<?xml-stylesheet type="text/xsl" href="notes.xsl"?>
Es muß ein Name wie oben definiert sein. Leerplatz zwischen dem Symbol ``<?'' und diesem Namen ist verboten. Anderer Leerplatz in der Processing Instruction wird an die Anwendung weitergegeben, ist also möglicherweise signifikant.
Die XML Spezifikation definiert dies nicht explizit, aber die beiden Nichtterminalsymbole ``Comment'' und ``PI'' treten in der Grammatik immer gemeinsam auf.
xmlTree [http://www.xmltree.com/] ist eine Art ``Yahoo!'' für XML-Dateien im Web. Eine andere Quelle sind Jon Bosak's Shakespeare-Dateien [http://sunsite.unc.edu/pub/sun-info/standards/xml/eg/shakespeare.1.10.xml.zip] und religöse Bücher (inklusive der Bibel) [http://sunsite.unc.edu/pub/sun-info/standards/xml/eg/rel200.zip].
Internet Explorer 5 enthält einen ``non-validating'' Parser für XML, und ist sogar für verschiedene UNIX-Betriebssysteme (inklusive Solaris) erhältlich [http://www.microsoft.com/windows/ie/download/ie5.htm]. Auch Netscape 6 und Mozilla sollen XML unterstützen. Es gibt im Web auch einen XML-Validierungs-Service von mehreren Anbietern, zum Beispiel [http://www.stg.brown.edu/service/xmlvalid/]. Dort müssen Sie nur die URL Ihrer XML-Datei eintragen. Sie können aber auch einen Parser lokal installieren, z.B. Apache Xerces [http://xml.apache.org/xerces-c/index.html] (Xerces ist im wesentlichen eine Bibliothek zum Zugriff auf XML-Daten in eigenen Programmen, aber die beigelegten Beispiel-Programme wie etwa DOMCount können zur Syntax-Prüfung verwendet werden.) Weitere Verweise finden Sie auf der WWW-Seite dieses Kurses [http://www.informatik.uni-giessen.de/staff/brass/xml00/].
© Stefan Brass (sbrass@sis.pitt.edu), 29. August 2000
Original URL: http://www.informatik.uni-giessen.de/staff/brass/xml00/c2_wellf.xml