[linux-l] Leerzeichen in XML

Volker Grabsch vog at notjusthosting.com
Fr Mai 5 17:26:27 CEST 2006


On Fri, May 05, 2006 at 09:22:01AM +0000, Rocco Rutte wrote:
> >Wobei es andererseits aber zumindest mit libxml schon wieder ein 
> >Unterschied ist, ob ich:
> 
> > <foo>
> >   <bar>
> >     Text
> >   </bar>
> > </foo>
> 
> >oder
> 
> > <foo><bar>Text</bar></foo>
> 
> >schreibe. Ich weiss aber auch nicht, was der XML-Standard dazu sagt (zur 
> >Einrückung mit Spaces+Newlines).
> 
> Das ist völliger Quatsch, das geht so nicht.
> 
> Hintergrund: Zwischen zwei Tags steht einfach nur "raw character data", 
> d.h. man zwischen '\n    Text\n  ' und 'Text' keine Unterschiede 
> festmachen (per Maschine, im Kopf schon).

Nein, stimmt nicht. Die Spaces (Leerzeichen/Neuzeilen) zwischen
<foo> und <bar> sind "ignorable".

Die Leerzeichen zwischen <bar> und </bar> sind es jedoch nicht, weil
dort auch nicht-Spaces stehen.

Allgemein gilt, soweit ich weiß: Wenn ein Element nur Unterknoten
hat (wie z.B. <foo>), dann sind alle Leerzeichen "ignorable".
Steht hingegen auch Text dort, sind sie es nicht.
(Ich lasse mir durch Verweis auf W3C-Dokumente gern vom Gegenteil
überzeugen)

Beispiel: Äquivalent sind:

    <foo>
        <bar>Text</bar>
    </foo>

und

    <foo><bar>Text</bar></foo>

Aber nicht:

    <foo>
        <bar>
            Text
        </bar>
    </foo>


Steht dort hingegen:

    <foo>
        Nochwas.
        <bar>Text</bar>
    </foo>

Dann sind auch die Leerzeichen innerhalb von <foo>...</foo> nicht
mehr "ignorable". Obiges wäre also *nicht* mehr äquivalent zu:

    <foo>Nochwas.<bar>Text</bar></foo>


Das ist auch die große Kunst der XML-Pretty-Printer: Nur "ignorable
spaces" einfügen. Die meisten machen das super. Bisher hatte ich
nur Ärger mit REXML (von Ruby), der leider in dem Stil

    <foo>
      <bar>
        Text
      </bar>
    </foo>

einrückt, und damit plötzlich signifikante (nicht-"ignorable")
Leerzeichen erzeugt.

Deshalb arbeite ich unter Ruby grundsätzlich lieber mit "libxml2",
das ohnehin viel schneller ist. :-) ... und wenigstens korrekt
arbeitet. Unter Python habe ich ebenfalls gute Erfahrungen mit
den Standard-XML-Sachen, und auch mit 4suite. Sie alle arbeiten,
soweit ich weiß, auf die oben beschriebene Art und Weise.

Diese sigifikanten Leerzeichen spielen auch eine wichtige Rolle
in XSLT, wenn man ein Dokument vom Typ "output='text'" erzeugt.
Da hat man dann leider nur noch die Wahl zwischen einer unleser-
lichen Textausgabe oder einem unleserlichen XSLT. Aber wenn man
sehr viel mit:

    <xsl:text>...meintext...</xsl:text>

arbeitet, geht es wieder halbwegs. Siehe auch:

    http://www.w3.org/TR/xslt#strip

(ist aber nur über XSLT, also nicht ganz das, was worum es geht)


Viele Grüße,

    Volker

-- 
Volker Grabsch
---<<(())>>---
Administrator
NotJustHosting GbR



Mehr Informationen über die Mailingliste linux-l