Sql-und-Xml - Home

Xml lernen

Die Erweiterung zu XML1.1 - zur Integration der Entwicklung von Unicode

Globale Darstellung der Änderungen von Xml-1.0 zu Xml-1.1

Die zwischen 1996 und 1998 entwickelte XML-Version 1.0 ist seit der Veröffentlichung am 10.02.1998 unverändert, die aktuell gültige vierte Edition vom 16.08.2006 umfaßt lediglich redaktionell-erläuternde Korrekturen. Die grundlegenden Definitionen, welche entscheiden, ob ein Dokument ein wohlgeformtes Xml-Dokument ist, blieben jedoch konstant. Erst auf der Basis dieser Stabilität konnten all jene weiterführenden Definitionen wie Namespace-Deklarationen, XSLT, SOAP sowie hierauf aufbauende Anwendungen entwickelt werden.

Eine wesentliche Stärke von Xml besteht darin, daß von vornherein Unicode unterstützt wurde. Die Unicode Version 2.0 vom Juli 1996 legt die Regeln fest, auf welche in den Definitionen zu Xml Bezug genommen wurde. Damit ist dieser Unicode-Standard selbst ein Teil des Xml-Standards. Seither hat sich Unicode jedoch über die Varianten 3.0 (September 1999), 3.1 (März 2001), 3.2 (März 2002) bis zur aktuellen Version Unicode 4.0 (April 2003) weiterentwickelt. Der Unterschied zwischen dem bisherigen Xml-1.0 und dem seit dem 04.02.2004 festgelegten Xml-1.1 besteht darin, daß letzteres diese Weiterentwicklung von Unicode berücksichtigt.

Zeichen, die in Unicode 2.0 fehlen, mögen bereits als Zeichendaten in Xml-1.0 verwendet worden sein. Ihre Verwendung ist jedoch nicht gestattet in Element- und Attribut-Namen, aufzählenden Attribut-Werten, processing-instructions und ähnlichem. Da die zukünftige Entwicklung von Unicode sozusagen 'nach oben hin' offen ist, hat sich die das gesamte Xml durchziehende Philosophie der sehr vielfältigen Möglichkeiten, Namen zu definieren, von Xml-1.0 zu Xml-1.1 gewandelt. In Xml-1.0 ist alles verboten, was nicht explizit erlaubt ist. Dies wird mit Xml-1.1 umgekehrt dahingehend, daß alles erlaubt ist, was nicht explizit verboten wurde. Damit ist die auch für Namen erlaubte Zeichenmenge nach oben hin offen, falls das BOM zu Beginn des Xml-Dokuments bzw. der Wert des encoding-Attributes vom Xml-Parser verstanden und das korrekte Unicode-Transformation-Format (UTF) auf den Bytestrom angewandt wird.

Bei Xml-1.0 gab es eine Besonderheit bezüglich der Markierung des Zeilenendes. Zwar wurden die verschiedenen Konventionen zwischen Windows-, Unix- und Macintosh-basierten Rechnern berücksichtigt. Das spezielle NEL (#x85), welches bsp. in Windows-basierten Unicode-Zeichensätzen ohnehin nicht belegt ist, auf IBM-kompatiblen Mainframes für Textdateien jedoch das Zeilenende markiert, fehlt in dieser Auflistung. Eine Wirkung war, daß Xml-Dokumente auf Mainframes dort keine lokal gültigen Textdateien waren. Umgekehrt verletzen auf Mainframes erstellte Xml-Dokumente entweder die dortigen Line-End-Regeln oder sie müssen zwischen ihrer Erstellung und ihrem Geparst-Werden zusätzlich transformiert werden, so daß alle #x85 entfernt werden. Zum Beseitigen dieser Inkonsistenz wurden NEL (…) sowie das Unicode-Zeilentrenner-Zeichen (
) zur Liste der Zeilen-End-Zeichen hinzugefügt.

In Xml-1.0 waren alle Zeichen-Entities, welche die Steuerzeichen #x1 bis #x1F maskierten, verboten. Die neue Version 1.1 erlaubt diese Zeichen, allerdings ausschließlich als Zeichenentities, nicht direkt im Dokument. Um die Robustheit der Encoding-Erkennung von Zeichendaten sicherzustellen, müssen nun auch die Steuerzeichen aus dem höheren Bereich zwischen #x7F und #x9F als Zeichenreferenzen notiert werden, Xml-1.0 hat diese frei erlaubt. Theoretisch ist dies eine Verletzung der Abwärtskompatibilität. Praktisch spielt diese jedoch kaum eine Rolle, da die meisten Xml-Dokumente mit gewöhnlichen Texteditoren erstellt werden und diese Steuerzeichen damit nicht eingegeben wurden. Weiterhin vollständig verboten bleibt #x0, sowohl direkt als auch als Zeichen-Entity. Dieses Zeichen wird in allen an C/C++ angelehnten Programmierumgebungen als Ende eines Strings interpretiert, so daß das fortgesetzte Ausschließen dieses Zeichens nachvollziehbar ist.

Die Änderungen im Detail

  • Erlaubter Zeichenbereich: Der erlaubte Zeichenbereich umfaßt nun die Blöcke #x1 - #xD7FF, #xE000 - #xFFFD und #x10000 - #x10FFFF. Dies sind alle Unicode-Zeichen mit Ausnahme der für die BOM-Markierung verwendeten Blöcke #xFFFE und #xFFFF. Vom ersten Block sind in Xml-1.0 nur die White-Spaces #x9 (Tab), #xA (Line Feed) und #xD (Carriage Return) zulässig gewesen.
  • Unicode-Version: Jeder Xml-Parser muß die UTF-8 und UTF-16 - Transformationen bis zu Unicode-4.0 verstehen. Ursprünglich (1998) war nur die Version 2.0 gefordert, diese Versionsforderung erhöhte sich mit jeder Überarbeitung von Xml-1.0. Die Unterstützung der 4 Byte umfassenden UTF-32 - Transformation ist derzeit nicht gefordert.
  • RestrictedChar: Dies ist ein neu eingeführter Begriff, der die Zeichen #x1 - #x8, #xB - #xC, #xE - #x1F, #x7F - #x84 und #x86 - #x9F umfaßt. Dies sind die nun zusätzlich erlaubten Steuerzeichen, ausgenommen Tab, Line Feed, Carriage Return und das NEL. RestrictedChars müssen jedoch immer als Zeichenentities notiert werden, sie dürfen nicht als direkte Bytefolgen im Xml-Dokument notiert sein.
  • NameStartChar: ":", A-Z, "_", a-z, #xC0 - #xD6, #xD8 - #xF6, #xF8 - #x2FF, #x370 - #x37D, #x37F - #x1FFF, #x200C - #x200D, #x2070 - #x218F, x2C00 - #x2FEF, #x3001 - #xD7FF, #xF900 - #xFDCF, #xFDF0 - #xFFFD, #x10000 - #xEFFFF.

    Die Menge dieser Zeichen, insbesondere die Ascii-Buchstaben und der Unterstrich, sind als Startzeichen für Namen erlaubt.
  • NameChar: "-", ".", 0-9, #xB7, #x0300 - #x036F, #x203F - #x2040 sowie alle NameStartChar.

    Die Menge dieser Zeichen ist innerhalb von Namen erlaubt. Umgekehrt formuliert: Ein Name darf nicht mit einem -, einem Punkt oder einer Zahl beginnen, innerhalb von Namen sind diese Zeichen zulässig.

    Dieser Unterteilung liegt der folgende Gedanke zugrunde: Gültige Xml-Namen können auch außerhalb des Xml-Kontextes von anderen Programmiersprachen genutzt werden. Damit wurden alle Zeichen für die Verwendung innerhalb von Namen ausgeschlossen, die als Trenner fungieren können. Da die obige Liste normativ ist, kann für andere Programmiersprachen garantiert werden, welche Zeichen nicht in Xml-Namen enthalten sind. Für Xml-Autoren läßt sich dies umgekehrt formulieren: Als Namen sollten bedeutungshaltige Wörter der jeweiligen natürlichen Sprache genutzt werden. Alle als Trenner / white space oder symbolisch genutzte Zeichen sind ausgeschlossen. Das Begriffspaar NameStartChar/NameChar ersetzt die Unterscheidung zwischen Buchstaben, Zahlen und anderen Zeichen, die Xml-1.0 noch verwendet hat.
  • End-of-Line - handling: Da das Zeilenende durch zwei weitere Zeichen markiert werden kann, ergibt sich eine Veränderung bei der dem Parsen vorgeschalteten Normalisierung: Alle Zeichenfolgen #xD #xA, #xD #x85, #x85, #x2028 sowie jedes #xD, auf das nicht sofort #xA oder #x85 folgt, sind durch ein einzelnes #xA zu ersetzen. Direkt vor dem Parsen wird ein Xml-Dokument damit gegebenenfalls verkürzt (aus #xD #xA mach #xA) und enthält keines der Zeichen #xD, #x85 und #x2028 mehr.

    Ob die Zeichen #x85 und #x2028 im Xml-Dokument erlaubt sind, kann erst nach dem Verarbeiten der Xml-Declaration mit der Versionsangabe und dem encoding-Attribut entschieden werden. Es gilt deshalb als fataler Fehler, wenn eines dieser Zeichen vor der Xml-Declaration verwendet wird. Alternativ formuliert: Die Xml-Declaration muß immer in der ersten Zeile des Dokumentes stehen, vorherige Leerzeilen mit Nicht-Ascii-Zeichen sind nicht erlaubt.
  • In externen geparsten Entities ist die Menge der RestrictedChar nicht zulässig.
  • Versionsangaben: Xml-1.1-Parser sollten Xml-1.0 weiterhin verstehen. Ist ein Dokument gemäß der Version 1.0 wohlgeformt oder valide und enthält es aus dem Bereich #x7F - #x9F höchstens durch Zeichenentities maskierte Zeichen, dann soll es als wohlgeformtes oder valides Xml-1.1-Dokument betrachtet werden, indem nur die Versionsnummer ersetzt wird.

    Jede Entity, einschließlich der Dokument-Entity, kann eigenständig als Version 1.0 oder 1.1 deklariert werden, die Deklaration in der Dokument-Entity legt die Version für das gesamte (logische) Xml-Dokument fest. Damit können bereits definierte und verwendete externe Entities der Version 1.0 von Xml-1.1-Dokumenten verwendet werden, ohne daß von diesen eine 1.1-Kopie erstellt werden muß.

    Fehlt eine Versionsangabe, so wird die Version 1.0 angenommen.

Hinweise für die Praxis mit Xml-1.1

  • Zunächst dürfte die Änderung des sechs Jahre alten Xml-Standards 1.0 hauptsächlich all jene Betriebssystemhersteller beschäftigen, welche die Xml-Parser entwickeln. Da ein 1.1-Parser auch die Version 1.0 korrekt verarbeiten muß und diesen bei fehlender Versionsangabe die Version 1.0 zuweist, bleiben alle auf der bisherigen Spezifikation basierenden Xml-Dokumente verarbeitbar.
  • Die Version 1.0 war in bezug auf das Handling des Zeilenendes inkonsistent. Gewisse Traditionen wurden berücksichtigt, andere nicht. Die Unterschiede zwischen verschiedenen Plattformen sind historisch begründet, so daß ein neuer, plattformübergreifender Standard entweder alle Versionen einheitlich berücksichtigen oder alle bislang gültigen Konventionen einheitlich ignorieren müßte. Die Integration von #x85 und #x2028 beseitigt diese Inkonsistenz der Version 1.0 zugunsten einer durchgängigen Berücksichtigung vorhandener Konventionen.
  • Angesichts der Dynamik der Unicode-Entwicklung hat die Version 1.0 die Möglichkeit für die Definition von Namen eher zu restriktiv gehandhabt. Den Xml-Regeln für Namen müssen auch Attributwerte (attribute values) genügen, erst dies ermöglicht die Designalternative zwischen Elementcontent und Attributwert (siehe Element oder Attribut bei einer eigenen DTD). Damit stellt der Wechsel von 'alle Zeichen sind verboten, die nicht explizit erlaubt sind' hin zu 'alle Zeichen sind erlaubt, die nicht explizit verboten sind' eine Öffnung des Standards hin zur Verwendung neuer Zeichen dar. Bislang war die Menge der in Namen erlaubten Zeichen beschränkt. Nun ist die Menge der verbotenen Zeichen limitiert, die Menge der erlaubten Zeichen dagegen nach oben geöffnet worden.
  • Die Möglichkeit, restrictedChar als Zeichenentities zu verwenden, erspart bislang notwendige, zusätzliche Transformationen solcher Zeichenketten in proprietäre Formate, etwa BinHex oder Base64, bevor diese als Daten einem Xml-Dokument hinzugefügt werden können. Ebenso entfällt die Notwendigkeit, die Information über die verwendete Zusatz-Codierung mitzusenden bzw. die Einschränkung auf Empfänger, die solche Elemente bsp. standardmäßig als Base64 decodieren. Diese Aufgabe wird nun vom Parser erledigt. Diese Änderung ermöglicht es systemnahen Entwicklern, Informationen, die Ascii-Steuerzeichen mit Ausnahme von #x0 enthalten, direkt in Xml-Dateien abzulegen, so daß für die gesamte Verarbeitung auf Standardwerkzeuge zurückgegriffen werden kann und proprietäre Techniken wie die Windows-Registrierung oder zusätzliche Transformationen verzichtbar sind.
  • Xml-1.1 ist nicht abwärtskompatibel. Ein Xml-Dokument in dieser Version kann von einem nur die Version 1.0 verarbeitenden Parser weder eingelesen noch verarbeitet werden. Dies ist jedoch nicht eine Folge der neuen Merkmale, sondern ergibt sich daraus, daß ein 1.0-Parser ein Dokument mit der Version 1.1 bereits nach dem Einlesen der Xml-Declaration mit einem fatalen Fehler zurückweist. Es ist jedoch damit zu rechnen, daß, sind Xml-1.1-verarbeitende Parser noch nicht weit verbreitet, die neuen Features nur in Zusammenhängen genutzt werden, in welchen geeignete Parser zur Verfügung stehen. In allen anderen Zusammenhängen kann weiterhin die Version 1.0 genutzt werden, bis über Betriebssystem-Updates 1.1-verarbeitende Parser zum Standard geworden sind.

© 2003-2017 Jürgen Auer, Berlin.