html.pages.de



die fünfte ausgabe von html.pages handelt..
vom frommen wunsch nach strukturierten daten
mittels XML

und warum das format mehr als tückisch ist.

Berlin, 2004-06-13

Im Prinzip liefern XMLsucks Wiki und XMLsucks.org schon die vielen Gründe weswegen XML, das vereinfachte Kind von SGML, noch lange nicht einfach genug ist. Zuviel Text, zu schlecht zu parsen, semantisch uneinheitlich (verwende ich jetzt Attribute oder Children?) und über seine Aufgabe der Datenaustauschsyntax überschätzt und plötzlich als Allheilmittel betrachtet für Datenspeicherung und, ganz schlimm, Netzwerkprotokolle.

Aus letzterer Abteilung stammt der Fall, der unsere besondere Aufmerksamkeit weckt: Der Psi Client für Jabber versendet nach Eingabe von "Du kannst das <HEAD> weglassen" folgenden XML Code (Ausschnitt):

» <body>Du kannst das &lt;HEAD> weglassen</body> «
Okay, denkt man sich, der ist kaputt. Das >-Zeichen nach HEAD hätte zu einem &gt; gewandelt werden müssen. Aber es geht weiter.

Der Jabber Server akzeptiert die Syntax, und man kann schon froh sein, wenn er sie nicht unverändert weiterverteilt (die neue Version tut das). Hoffentlich ist diese Kodierung nicht erlaubt, und beide Programme fehlerhaft. Die XMPP-Spezifikation verbietet sie, verweist dabei auf §4.6 der XML-Spezifikation zur Festlegung der predefined entities. Somit ist XMPP nicht ganz blöd:

» character data or attribute values containing unescaped characters that map to the predefined entities (Section 4.6 therein); such characters MUST be escaped «
Wie kommt es dann, dass mehrere Programme in dieser Hinsicht fehlerhaft sind? Das liegt vermutlich daran, dass sie mehr oder weniger standardisierte XML-Implementationen verwenden, welche diese Einschränkungen nicht beachten, und -jetzt kommts- gemäß XML-Spezifikation ist oben genanntes Beispiel nämlich gültiges XML!

Man kann sich beim Parsen von XML also nicht einmal auf die Abwesenheit von >-Zeichen im character data Bereich verlassen! Da heisst es nämlich:

» The right angle bracket (>) MAY be represented using the string "&gt;", and MUST, for compatibility, be escaped using either "&gt;" or a character reference when it appears in the string "]]>" in content, when that string is not marking the end of a CDATA section. «
Wie gnädig, man darf es escapen.

Was folgern wir aus dieser Erfahrung? Schreibe NIEMALS einen eigenen XML-Parser. Wenn Du XML nicht vermeiden kannst, verwende eine etablierte Implementation die alle Absurditäten beherrscht. Denn so machbar es zunächst auch erscheint, Dein XML-Parser wird Dich mehr Zeit kosten, als die Applikation die Du damit ausstatten wolltest.

Allerdings, wenn Du damit Jabber-Protokoll implementieren willst, dann wird sich Deine Applikation ebenfalls im Bruch mit XMPP befinden, aber damit ist sie ja dann in bester Gesellschaft. Würdest Du Dich tatsächlich an XMPP halten, wären alle Psi-Anwender ausgeschlossen.