Html à l'intérieur de XML. Devrais-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 si il est complètement sûr à utiliser. Et je devrais le décoder à nouveau.
Utilisez les sections CDATA: je pourrais encore 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 extrairait les informations de manière transparente pour moi.
Quelle option devrais-je choisissez?
UPDATE: le xml sera créé en java et transmis sous forme de 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);"
11 réponses
, Les deux options sont presque exactement les mêmes. Voici vos deux choix:
<html>This is <b>bold</b></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 soulignez, 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.
CDATA est plus facile à lire à l'œil nu alors que le contenu codé peut contenir des marqueurs CDATA de fin en toute sécurité - mais vous n'avez pas à vous en soucier. Il suffit d'utiliser une bibliothèque XML et cesser de s'inquiéter à ce sujet. Ensuite, tout ce que vous avez à dire est "mettre ce texte dans cet élément" et la bibliothèque l'encodera ou l'enveloppera dans des marqueurs CDATA.
Si vous utilisez CDATA, vous devez le décoder correctement (textContent, value et innerHTML sont des méthodes qui ne retourneront pas les données appropriées).
Supposons que vous utilisez une structure xml similaire à ceci:
<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&iwloc=A&t=h&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&iwloc=A&t=h&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&iwloc=A&t=h&z=18" target="_blank">-22.7242,-50.2352</a></td></tr>
]]>
</content>
</command>
</response>
En javascript, vous décoderez en chargeant le xml (jquery, par exemple) dans une variable comme xmlDoc ci-dessous, puis en obtenant la 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
Je ne sais pas quel constructeur XML vous utilisez, mais PHP (en fait libxml) sait comment gérer ]]>
dans les sections CDATA, et devrait donc tous les autres framework XML. Donc, j'utiliserais une section CDATA.
Il est logique d'envelopper HTML dans CDATA. Le texte HTML constituera probablement sur une seule valeur en XML.
Donc, ne pas l'envelopper dans CDATA entraînera tous les analyseurs xml à le lire comme une partie du document XML. Bien qu'il soit facile de contourner ce problème en utilisant le xml, pourquoi le mal de tête supplémentaire?
Si vous voulez réellement analyser le HTML dans un DOM, alors il vaut mieux lire le texte HTML, et configurer un analyseur pour lire le test séparément.
Espoir qui est sorti de la façon dont je l'a voulu.
Personnellement, je déteste les segments CDATA, donc j'utiliserais l'encodage à la place. 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? Je souhaite que je savais. Préférence personnelle, surtout. Je n'aime pas m'habituer à ajouter des "caractères interdits" dans un segment spécial où ils seraient soudainement autorisés à nouveau. Cela me confond juste quand je vois un balisage XML dans un segment CDATA et ce n'est pas le cas une partie du XML qui l'entoure. Au moins avec l'encodage, je vais voir qu'il est encodé.
Les bonnes bibliothèques XML géreront les segments d'encodage et de CDATA de manière transparente. C'est juste mes yeux qui sont blessés.
Encodage cela fonctionnera bien et est fiable. Vous pouvez encoder des sections codées, etc. sans aucune difficulté.
Le décodage se fera automatiquement par N'importe quel analyseur XML utilisé pour gérer votre code HTML codé.
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 quand il s'agit de javascript inclus, l'encodage entraîne souvent des problèmes. CDATA vous aide certainement là-bas.
Si vous prévoyez d'utiliser uniquement de petits extraits (ie. un paragraphe) et avoir un moyen de le prétraiter / filtrer (parce que oyu ne veut pas de javascript ou de choses fantaisistes de toute façon), vous serez probablement mieux avec l'encodage ou en fait, il suffit de le mettre directement en tant que sous-arbre dans le xml. Vous pouvez également traiter le html (ie style de filtre ou onclick attributs). Mais ce n'est certainement plus de travail.
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 passer. Le contenu à l'intérieur de <h1>...</h1>
doit être codé en entités html comme par exemple <
, pour <
.
L'encodage entre les balises résoudra le problème de]] > s'interprètent lorsqu'il est converti en ]]>
et les balises html ne contiennent pas ]]>
.
Vous ne pouvez le faire que si html est généré par vous-même.
Si votre code HTML est bien formé, il suffit d'intégrer les balises HTML sans s'échapper ou s'encapsuler dans CDTATA. Si possible, cela aide à garder 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, de sorte que vous puissiez désambiguïser vos balises HTML de l'autre XML l'enveloppant.
Texte échappé signifie que le bloc HTML entier sera un gros nœud de texte. L'encapsulation dans CDATA indique à L'analyseur XML ne pas analyser cette section. Il peut être "plus facile", mais limite vos capacités downrange et ne devrait être utilisé que lorsque cela est approprié; pas seulement parce qu'il est plus pratique. Le balisage échappé est considéré comme nuisible.