web-dev-qa-db-fra.com

HTML dans XML. Dois-je utiliser CDATA ou encoder le code HTML

J'utilise XML pour partager du contenu HTML. AFAIK, je pourrais intégrer le HTML soit par:

  • Encodage: je ne sais pas s'il est complètement sûr à utiliser. Et je devrais le décoder à nouveau.

  • Utilisez les sections CDATA: je pourrais toujours avoir des problèmes si le contenu contient la balise de fermeture "]]>" et certains caractères hexadécimaux, je crois. D'un autre côté, l'analyseur XML extrait les informations de manière transparente pour moi.

Quelle option dois-je choisir?

MISE À JOUR: Le xml sera créé en Java et transmis en tant que chaîne à un service Web .net, s'il sera analysé. Par conséquent, je dois pouvoir exporter le xml en tant que chaîne et le charger en utilisant "doc.LoadXml (xmlString);"

35
alberto

Les deux options sont presque exactement les mêmes. Voici vos deux choix:

<html>This is &lt;b&gt;bold&lt;/b&gt;</html>

<html><![CDATA[This is <b>bold</b>]]></html>

Dans les deux cas, vous devez vérifier votre chaîne pour les caractères spéciaux à échapper. Beaucoup de gens prétendent que les chaînes CDATA n'ont pas besoin de s'échapper, mais comme vous le faites remarquer, vous devez vous assurer que "]]>" ne glisse pas sans échapper.

Dans les deux cas, le processeur XML vous renverra votre chaîne décodée.

30
Ned Batchelder

CDATA est plus facile à lire à l'œil nu tandis que le contenu encodé peut contenir des marqueurs CDATA en toute sécurité - mais vous n'avez pas à vous en soucier. Utilisez simplement une bibliothèque XML et cessez de vous en soucier. Ensuite, tout ce que vous avez à dire est "Mettez ce texte dans cet élément" et la bibliothèque le codera ou l'enveloppera dans des marqueurs CDATA.

12
Quentin

CDATA pour plus de simplicité.

7
Mohamed

Si vous utilisez CDATA, vous devez le décoder correctement (textContent, value et innerHTML sont des méthodes qui ne renverront PAS les données appropriées).

disons que vous utilisez une structure xml similaire à celle-ci:

<response>
    <command method="setcontent">
        <fieldname>flagOK</fieldname>
        <content>479</content>
    </command>
    <command method="setcontent">
        <fieldname>htmlOutput</fieldname>
        <content>
            <![CDATA[
            <tr><td>2013/12/05 02:00 - 2013/12/07 01:59 </td></tr><tr><td width="90">Rastreado</td><td width="60">Placa</td><td width="100">Data hora</td><td width="60" align="right">Km/h</td><td width="40">Direção</td><td width="40">Azimute</td><td>Mapa</td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:55</td><td align='right'>113</td><td align='right'>NE</td><td align='right'>40</td><td><a href="http://maps.google.com/maps?q=-22.6766,-50.2218&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.6766,-50.2218</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 13:56</td><td align='right'>112</td><td align='right'>NE</td><td align='right'>23</td><td><a href="http://maps.google.com/maps?q=-22.6638,-50.2106&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.6638,-50.2106</a></td></tr><tr><td>Silverado</td><td align='left'>CQK0052</td><td>05/12/2013 18:00</td><td align='right'>111</td><td align='right'>SE</td><td align='right'>118</td><td><a href="http://maps.google.com/maps?q=-22.7242,-50.2352&amp;iwloc=A&amp;t=h&amp;z=18" target="_blank">-22.7242,-50.2352</a></td></tr>
            ]]>
        </content>
    </command>
</response>

en javascript, vous décoderez ensuite en chargeant le xml (jquery, par exemple) dans une variable comme xmlDoc ci-dessous puis en obtenant le nodeValue pour la 2ème occurrence (item(1)) de la balise content

xmlDoc.getElementsByTagName("content").item(1).childNodes[0].nodeValue

ou (les deux notations sont équivalentes)

xmlDoc.getElementsByTagName("content")[1].childNodes[0].nodeValue
3
tony gil

Je ne sais pas quel générateur XML vous utilisez, mais PHP (en fait libxml) sait comment gérer ]]> à l'intérieur des sections CDATA, tout comme tous les autres frameworks XML. Donc, j'utiliserais une section CDATA.

1
Ionuț G. Stan

Il est logique d'envelopper HTML dans CDATA. Le texte HTML constituera probablement sur une seule valeur en XML.

Donc, si vous ne l'enveloppez pas dans CDATA, tous les analyseurs xml le liront comme faisant partie du document XML. Bien qu'il soit facile de contourner ce problème lors de l'utilisation du XML, pourquoi le mal de tête supplémentaire?

Si vous souhaitez réellement analyser le code HTML dans un DOM, il est préférable de lire le texte HTML et de configurer un analyseur pour lire le test séparément.

J'espère que c'est ainsi que je l'ai voulu.

1
jrharshath

Personnellement, je déteste les segments CDATA, donc j'utiliserais plutôt l'encodage. Bien sûr, si vous ajoutez XML à XML à XML, cela entraînerait un encodage sur encodage sur encodage et donc des résultats très illisibles. Pourquoi je déteste les segments CDATA? Si seulement je savais. Préférence personnelle, surtout. Je n'aime tout simplement pas m'habituer à ajouter des "caractères interdits" dans un segment spécial où ils seraient soudainement autorisés à nouveau. Cela m'embrouille simplement lorsque je vois du balisage XML dans un segment CDATA et qu'il ne fait pas partie du XML qui l'entoure. Au moins avec l'encodage, je verrai qu'il est encodé.

De bonnes bibliothèques XML géreront à la fois l'encodage et les segments CDATA de manière transparente. Ce sont juste mes yeux qui se blessent.

1
Wim ten Brink

L'encodage fonctionnera correctement et est fiable. Vous pouvez encoder des sections encodées, etc. sans aucune difficulté.

Le décodage sera effectué automatiquement par tout analyseur XML utilisé pour gérer votre code HTML codé.

0
Brian Agnew

je pense que la réponse dépend de ce que vous prévoyez de faire avec le contenu html, et aussi du type de contenu html que vous prévoyez de prendre en charge.

Surtout en ce qui concerne le javascript inclus, l'encodage entraîne souvent des problèmes. CDATA vous y aide certainement.

Si vous prévoyez d'utiliser uniquement de petits extraits (c'est-à-dire un paragraphe) et que vous avez un moyen de prétraiter/filtrer (parce que vous ne voulez pas de javascript ou de fantaisie de toute façon), vous ferez probablement mieux d'encoder ou de le mettre directement comme sous-arborescence dans le xml. Vous pouvez ensuite également post-traiter le code HTML (c'est-à-dire le style de filtre ou les attributs onclick). Mais c'est certainement plus de travail.

0
Niko

Vous pouvez utiliser une combinaison des deux. Par exemple: vous voulez passer <h1>....</h1> dans le nœud xml, vous devez utiliser la section CDATA pour le transmettre. Contenu à l'intérieur <h1>...</h1> doit être codé en entités html comme par exemple &lt;, pour <. L'encodage entre les balises résoudra le problème de]]> être interprété lors de sa conversion en ]]&gt; et les balises html ne contiennent pas ]]>.

Vous ne pouvez le faire que si le html est généré par vous-même.

0
Xinus

Si votre code HTML est bien formé, il vous suffit d'incorporer les balises HTML sans s'échapper ni envelopper dans CDTATA. Dans la mesure du possible, cela aide à conserver votre contenu en XML. Il vous donne plus de flexibilité pour transformer et manipuler le document.

Vous pouvez définir un espace de noms pour le HTML, afin de pouvoir lever l'ambiguïté de vos balises HTML des autres XML qui l'enveloppent.

Le texte échappé signifie que le bloc HTML entier sera un grand nœud de texte. L'encapsulation dans CDATA indique à l'analyseur XML de ne pas analyser cette section. Cela peut être "plus facile", mais limite vos capacités et ne devrait être utilisé que lorsque cela est approprié; pas seulement parce que c'est plus pratique. Le balisage échappé est considéré comme dangereux.

0
Mads Hansen