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.

Link zur hiesigen Seite als QR-Code
Kontaktformular:
Schreiben Sie mir und wir bauen gemeinsam Ihre neue Web-Datenbank!
© 2003-2025 Jürgen Auer, Berlin.