molily: (X)HTML-Parsing und -Serialisierung

Beitrag lesen

Hallo,

Vielleicht kann mir ja einer von den Cracks hier erklären, was dieses Verhalten soll? Dass Software meint, besser als ich zu wissen, was ich will, habe ich bisher eher mit windows Programmen assoziiert.

var o=document.getElementById("test");  
o.innerHTML = "test<br />test";  
alert(o.innerHTML); // test<br>test

Hier geht alles mit rechten Dingen zu. Du verstehst anscheinend nicht, was hier vorgeht (soll kein Vorwurf sein). Ich werd’s versuchen zu erklären.

Drei Begriffe sind hier zum Verständnis nötig:

  • Parsing – das Einlesen und Verarbeiten von Markup (das ist eine Zeichenkette) zu einer Objektstruktur im Speicher.
  • DOM, Document Object Model – die Objektstruktur im Speicher, die das Markup repräsentiert. Genauer gesagt ist das ein Knotenbaum.
  • Serialisierung – Die Umwandlung der Objektstruktur in Markup, damit sie übertragen oder gespeichert werden kann.

Du parst hier XHTML-Syntax zu DOM. Dann serialisierst du das DOM zu HTML-Syntax. Was kommt heraus? HTML-Code! Das ist kein Wunder.

Der Browser verwendet zum Parsen von HTML einen HTML5-konformen Parser. Das gilt auch für den XHTML-Schnipsel, den du innerHTML zuweist. XHTML-Markup schluckt der HTML5-Parser ebenfalls (siehe auch Parsing HTML fragments).

Das Markup wird also eingelesen und in DOM-Knoten umgesetzt. In dem Moment ist jede Information darüber, wie das Markup ursprünglich aussah, verloren! Das DOM weiß nichts davon, wie es ursprünglich mal serialisiert war. Der Browser nimmt beim Parsen verschiedene Normalisierungen vor. In Pseudocode ausgedrückt: Der Ergebnis von serialisierung(parsing(code)) gibt nicht exakt den Eingabewert zurück.

Das Serialisieren des DOM ist ebenfalls in HTML5 standardisiert. HTML5 kennt zwei Syntaxen zur Repräsentation von HTML5-Dokumenten: Die HTML-Syntax und die XHTML-Syntax. Wenn du innerHTML ausliest, so wird eine HTML-Fragment-Serialisierung vorgenommen (siehe link:http://domparsing.spec.whatwg.org/@title=DOM Parsing and Serialization]). Was herauskommt, ist also immer HTML-Syntax. Für XML-Syntax gibt es den XMLSerializer.

Also: Du gibst "<br />" hinein, damit erzeugst du einen br-Elementknoten im DOM. In HTML-Syntax serialisiert ergibt das "<br>".

Grüße,
Mathias