2009-03-20 5 views
3

Ist dies ein gültiges (wohlgeformtes) XML-Dokument?Sind XHTML-Entities in XML-Dokumenten gültig, solange sie in CDATA-Tags enthalten sind?

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&copy;</inner> 
</outer> 

Umstritten ist, ob das HTML/XHTML „©“ Entity-Codierung in einem XML-Dokument gültig ist, wo es keine DTD oder Schema ist es zu definieren. Eine alternative Möglichkeit, die oben auszudrücken wäre, dies zu sagen:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&#169;</inner> 
</outer> 

die gültige XML mit einer UTF-8-Codierung scheint zu sein.

Aber gilt dies:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 

Der Autor der oben auf den XML-Parser, um anzuzeigen, beabsichtigt, dass sie oben als die Schnur durch das Copyright-Symbol passieren sollten „& copy;“ anstatt als richtiges Unicode-Zeichen. In dieser Hinsicht finde ich dieses Zitat ein wenig verwirrend: "Neue Autoren von XML-Dokumenten missverstehen oft den Zweck eines CDATA-Abschnitts, irrtümlicherweise glauben sie, dass ihr Zweck darin besteht, Daten während der Verarbeitung als gewöhnliche Zeichendaten zu schützen . [Aber] Zeichendaten Zeichendaten, unabhängig davon, ob sie über einen CDATA-Abschnitt oder gewöhnlichen Markup ausgedrückt wird.“(Aus Wikipedia)

ich seperat bin auf ein vorgeschlagenes XML-Format von einem zweiten Autor suchen, die jeden gewickelt haben Tag in CDATA-Abschnitte, auch wenn der Tag kann zum Beispiel nur Ziffern enthalten.

Hoffnung ein XML-Guru über den Zweck der CDATA die Verwirrung aufklären helfen.

Dank!

Antwort

7

Ein CDATA-Abschnitt dient dazu, literalen Text zuzulassen, der normalerweise in einem XML-Dokument auf eine spezielle Weise interpretiert wird. Das heißt, etwas, das wie eine Entitätsreferenz aussieht oder etwas, das wie XML-Tags aussieht. Alles in einem CDATA-Abschnitt kann sich in gültigem XML ohne einen CDATA-Abschnitt befinden; Sie müssen nur Entity-Verweise verwenden, um die verschiedenen Sonderzeichen zu codieren, damit sie nicht als XML-Markup behandelt werden, sondern als Zeichendaten, die den Wert eines Tags darstellen.

Also ja, ist die folgende vollkommen gültig, solange es ist, was Sie beabsichtigen:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 

Hier wird der Wert des inner Element ist der Wert &copy;, die nicht durch den XML-Parser interpretiert werden als Entitätsreferenz für das Copyright-Symbol. Sie können auch Folgendes tun:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[<normally> this looks <like/> &amp; xml </normally>]]></inner> 
</outer> 

wo der Wert für das inner Element ist

<normally> this looks <like/> &amp; xml </normally> 

dies ohne CDATA-Abschnitt zu tun:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&lt;normally&gt; this looks &lt;like/&gt; &amp;amp; xml &lt;/normally&gt;</inner> 
</outer> 

die viel weniger ist human- lesbar, aber äquivalent, soweit es sich um einen XML-Parser handelt. Wenn Sie das getan hat (unter der Annahme, dass das inner Element definiert ist, eine ein Schema oder DTD als eine Zeichenfolge enthält, und nicht XML) dann Ihre XML-Parser wird sich beschweren:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><normally> this looks <like/> &amp; xml </normally></inner> 
</outer> 

so verwenden Sie das CDATA oder juristische Person zu entkommen die schützen Sonderzeichen aus dem XML-Parser so den Client der XML-Daten können den Wert von inner erhalten, die XML-Markup-Zeichen enthalten passiert.

Hinweis: klar sein, das obige Beispiel gut XML gebildet, aber wenn das Schema oder DTD sagt, dass das Element inner enthält xsd: string oder gleichwertig, dann ist es ein ungültig XML-Dokument.

Und nein, HTML oder XHTML Einheiten, die nicht als Teil der XML definiert werden, sind selbst XML nicht gültig, wenn sie definiert sind. Ihr XML-Parser gibt einen Fehler zurück.

+0

Das letzte Beispiel ist wohlgeformt, nicht wahr? Sie sagen nur, dass jede DTD oder XSD, die angewendet wurde, verschachtelte Tags zulassen müsste ... Ich möchte nur sicherstellen, dass ich verstanden habe. :-) –

+0

Ja, das letzte Beispiel * ist * wohlgeformtes XML, aber es kann ein ungültiges XML sein, wenn das Schema oder die DTD angibt, dass der Inhalt des "inneren" Tags Zeichendaten und keine anderen Elemente sind. – Eddie

+0

Ich habe meinen Kommentar als Antwort auf deinen Kommentar aktualisiert. – Eddie

1

der Inhalt eines CDATA-Blocks werden von ignoriert Der XML-Parser, also in Bezug auf Validierung und Parsability, können Sie innerhalb von CDATA beliebig platzieren.

Natürlich, die auch mit der Tatsache kommt, dass CDATA als willkürlich behandelt wird, so dass, wenn Sie eine tatsächliche © in Ihrer XML wollen, wird dies nicht funktionieren. Wir nehmen an, dass Sie planen, den Inhalt der CDATA in einen X/HTML-Parser zu laden, genauso wie Sie möglicherweise einen Blob von base64-kodierten Binärdaten aus einem Bild in einen Bildparser laden. Ein XML-Parser versucht nicht, aus dem Inhalt eines CDATA-Blocks eine Bedeutung abzuleiten; es könnte auch "foo" sagen, wie es sagt &copy;.

Das Wikipedia-Zitat scheint verwirrend formuliert zu sein.

+1

Nein, es wird nicht ignoriert, es wird nur wörtlich an die Anwendung übergeben, als reiner Text. – bortzmeyer

5

Eddie eine gute Antwort gab, habe ich in einigen Punkten nur vollständig, dass er offenbar nicht erwähnt.

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&copy;></inner> 
</outer> 

ist nicht legal (entity "Kopieren" nicht vordefiniert ist, werden nur "LT", "gt" und "quot" sind, in XML).

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&#169;</inner> 
</outer> 

ist vollkommen legal und wahrscheinlich gibt, was Sie wollen (ein Copyright Symbol).

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 

ist auch vollkommen legal, sondern ergibt sich ein ganz anderes Ergebnis (das Element <inner> wird sechs Unicode-Zeichen enthalten, anstelle eines in das vorherige Beispiel).

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE outer[ 
<!ENTITY copy "&#169;"> 
]> 
<outer> 
    <inner>&copy;></inner> 
</outer> 

ist auch legal und gibt das gleiche Ergebnis wie das zweite Beispiel. Es kann sparen Sie einige Zeichen eingeben, die Sie verwenden, sind aber nicht leicht zu erzeugen mit der Tastatur/Editor.

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>©</inner> 
</outer> 

legal ist, auch (weil encoding = "UTF-8", mit encoding = "US-ASCII", es wäre unmöglich gewesen), und gibt das gleiche Ergebnis.Vorausgesetzt, dass Ihre Tastatur/Editor ermöglicht Ihnen, dieses Zeichen direkt zu verwenden.

Verwandte Themen