2009-03-20 5 views
3

Est-ce un document XML valide (bien formé)?Les encodages d'entités XHTML sont-ils valides dans les documents XML tant qu'ils sont contenus dans des balises CDATA?

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

La question est de savoir si l'entité HTML/XHTML « © » de codage est valable dans un document XML où il n'y a pas DTD ou schéma pour la définir. Une autre façon d'exprimer ce qui précède serait de dire:

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

qui semble être XML valide avec un encodage UTF-8.

Mais est ce valide:

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

L'auteur du compte ci-dessus pour indiquer à l'analyseur XML qu'il doit passer par le symbole de copyright ci-dessus comme la chaîne « & copie; » plutôt que comme un caractère Unicode approprié. À cet égard, je trouve cette citation un peu déroutante: «Les nouveaux auteurs de documents XML ont souvent mal compris le but d'une section CDATA, croyant à tort que son but est de« protéger »les données d'être traitées comme des données de caractères ordinaires pendant le traitement. . [Mais] les données de caractère est des données de caractère, peu importe si elle est exprimée par une section CDATA ou balisage ordinaire. »(De Wikipedia)

Je cherche séparement à un format XML proposé à partir d'un second auteur qui a enveloppé tous balise dans les sections CDATA même lorsque l'étiquette peut, par exemple, contenir que des chiffres.

Espérons un gourou XML peut aider à éclaircir la confusion sur le but de CDATA.

Merci!

Répondre

7

Une section CDATA a pour but d'autoriser du texte littéral normalement interprété d'une manière spéciale dans un document XML. C'est-à-dire, quelque chose qui ressemble à une référence d'entité, ou quelque chose qui ressemble à des balises XML. Tout ce qui se trouve dans une section CDATA peut se trouver dans un fichier XML valide sans section CDATA; vous aurez juste besoin d'utiliser des références d'entité pour encoder les différents caractères spéciaux afin qu'ils ne soient pas traités comme des balises XML, mais comme des données de caractères qui sont la valeur d'une balise.

Alors oui, ce qui suit est parfaitement valable, tant qu'il est ce que vous avez l'intention:

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

Ici, la valeur de l'élément inner est la valeur &copy; qui ne sera pas interprété par l'analyseur XML comme référence d'entité pour le symbole de copyright. Vous pouvez également effectuer les opérations suivantes:

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

où la valeur de l'élément inner est

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

Pour faire cela sans une section CDATA:

<?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> 

qui est beaucoup moins origine humaine lisible, mais équivalent en ce qui concerne un analyseur XML. Si vous avez fait cela (en supposant que l'élément inner est défini un schéma ou DTD comme contenant une chaîne et non XML) alors votre analyseur XML se plaindra:

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

si vous utilisez la CDATA ou entité échapper à protéger la caractères spéciaux de l'analyseur XML afin que le client des données XML puisse obtenir la valeur inner qui contient des caractères de balisage XML.

Note: Pour être clair, l'exemple ci-dessus est bien formé XML, mais si le schéma ou DTD indique que l'élément inner contient xsd: string ou équivalent, il est un document XML invalide. Non, les entités HTML ou XHTML qui ne sont pas définies comme faisant partie du XML ne sont pas des données XML valides à moins qu'elles ne soient définies. Votre analyseur XML renverra une erreur.

+0

Ce dernier exemple est bien formé n'est-ce pas? Vous dites juste que n'importe quelle DTD ou XSD qui s'appliquerait devrait permettre des étiquettes imbriquées ... Je veux juste m'assurer que j'ai bien compris. :-) –

+0

Oui, le dernier exemple * est * bien formé en XML, mais il peut être invalide en XML si le schéma ou la DTD indique que le contenu de la balise "inner" est une donnée de caractère et non d'autres éléments. – Eddie

+0

J'ai mis à jour mon asnwer en réponse à votre commentaire. – Eddie

1

le contenu d'un bloc CDATA sont ignorés par l'analyseur XML, donc en ce qui concerne la validation et la parséabilité, vous pouvez mettre ce que vous voulez dans CDATA.

Bien sûr, cela vient aussi du fait que CDATA est traité comme arbitraire, donc si vous voulez une © réelle dans votre XML, cela ne fonctionnera pas. Nous supposons que vous prévoyez de charger le contenu du CDATA dans un analyseur X/HTML, tout comme vous pourriez charger un blob de données binaires codées en base64 à partir d'une image dans un analyseur d'image. Un analyseur XML ne tente pas de dériver la signification du contenu d'un bloc CDATA; il pourrait aussi bien dire "foo" comme il est dit &copy;.

La citation de Wikipédia semble être libellée de manière confuse.

+1

Non, il n'est pas ignoré, il est simplement passé littéralement à l'application, sous forme de texte pur. – bortzmeyer

5

Eddie a donné une bonne réponse, je viens de terminer sur certains points qu'il n'a apparemment pas mentionnés.

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

est pas légal (entité "copie" est pas prédéfinie, que "lt", "gt" et "quot" sont, en XML).

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

est parfaitement légal et donne probablement ce que vous voulez (un symbole de copyright ).

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

est aussi parfaitement légal, mais donne un résultat tout à fait différent (l'élément <inner> contiendra six caractères Unicode, au lieu d'un dans l'exemple précédent).

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

est également autorisé et donne le même résultat que le second exemple. Il peut vous éviter de taper certains caractères que vous utilisez mais ne sont pas faciles à générer avec votre clavier/éditeur.

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

est légal aussi (parce que encoding = "UTF-8", avec encoding = "US-ASCII", il aurait été impossible), et donne le même résultat.À condition que votre clavier/éditeur vous permette d'utiliser directement ce caractère.

Questions connexes