Est-il un moyen d'échapper à une CDATA fin jeton en xml?
Je me demandais si il existe un moyen d'échapper à une CDATA fin jeton (]]>
) dans une section CDATA dans un document xml. Ou, plus généralement, s'il existe une séquence d'échappement pour l'utilisation dans un CDATA (mais si ça existe, je pense qu'il faudrait probablement seulement du sens pour échapper à commencer ou à la fin des jetons, de toute façon).
Fondamentalement, vous pouvez avoir un début ou de fin de jeton incorporé dans un CDATA et de dire à l'analyseur de ne pas l'interpréter, mais de la traiter comme une séquence de caractères.
Probablement, vous devez juste refactoriser votre structure xml ou votre code si vous vous trouvez en essayant de le faire, mais même si j'ai été travailler avec xml sur une base quotidienne pour les 3 dernières années et je n'ai jamais eu ce problème, je me demandais si c'était possible. Juste de la curiosité.
Edit:
Autres que d'utiliser le codage html...
- Tout d'abord, j'accepte la réponse comme correcte mais attention: Rien n'empêche quelqu'un de codage
>
comme>
dans CData à assurer intégré]]>
ne sera pas analysée comme CDEnd. Cela signifie tout simplement que c'est inattendu et que&
doit d'ABORD être encodé comme&
trop de sorte que les données peuvent être correctement décodés. Les utilisateurs de ce document doit savoir décoder ce CData trop. Il n'est pas rare, car une partie de l'objet de la CData est de contenir le contenu que le consommateur comprenne comment gérer. Une telle CData tout ne peut pas être prévu pour être interprété correctement par n'importe quel générique de consommation. - CDATA fournit simplement une façon explicite de déclarer nœud de texte de contenu, telles que la langue des jetons dans un délai de (autre que ]]>) n'obtiennent pas analysée. Concrètement, il ne se développe pas de références d'entité > pour cette raison, donc, dans un bloc CDATA, cela veut simplement dire que ces quatre caractères, pas " >'. Pour le mettre en perspective: dans le xml spécification, tout le texte contenu est appelé "cdata", et pas seulement de ces séquences ("données de caractère"). Ce n'est pas le sujet spécifique de consommer des agents. (Une telle chose n'existe pas si -- instructions de traitement (<?instruction cible?>).
- (Je dois ajouter, même si ce genre de chose va à l'encontre de l'intention initiale du nœud, tout est juste dans la long & tortueux bataille avec XML. Je viens de sentir qu'elle pourrait être utile pour les lecteurs de savoir que <![CDATA[]]> n'a pas été conçu à cette fin.)
CDATA
a été conçu pour permettre quoi que ce soit: ils sont utilisés pour échapper à des blocs de texte contenant des caractères qui seraient autrement reconnu comme le balisage Qui impliqueCDATA
trop car il est aussi le balisage. Mais, en fait, vous n'avez pas besoin du double encodage, j'implicite.]]>
est un moyen acceptable de codage d'unCDEnd
dans unCDATA
.- Vrai, vous n'auriez pas besoin de double encodage -- mais vous auriez encore besoin de l'agent d'avoir de connaissances particulières, puisque l'analyseur de ne pas analyser les > comme >. C'est ce que tu veux dire mais, je pense? Que vous pourriez les remplacer comme bon vous semble, après l'analyse?
Vous devez vous connecter pour publier un commentaire.
Clairement, cette question est purement académique. Heureusement, il a une réponse définitive.
Vous ne pouvez pas échapper à une CDATA fin de la séquence. La Production de la règle 20 du XML spécification est tout à fait clair:
EDIT: Ce produit règle signifie littéralement "Une section CData peut contenir tout ce que vous voulez, MAIS la séquence"]] >'. Aucune exception.".
EDIT2: Le même section lit aussi:
En d'autres termes, il n'est pas possible d'utiliser de l'entité de référence, de balisage ou de toute autre forme d'interpréter la syntaxe. La seule analysé le texte à l'intérieur d'une section CDATA est
]]>
, et il termine la section.Par conséquent, il n'est pas possible d'échapper à
]]>
dans une section CDATA.EDIT3: La même section lit aussi:
Alors il y a peut être une section CDATA partout personnage de données peut se produire, y compris adjacentes multiples sections CDATA en place d'une seule section CDATA. Qui permet qu'il soit possible de diviser le
]]>
jeton et mettre les deux parties adjacentes des sections CDATA.ex:
devrait être écrit comme
<script>/*<![CDATA[*/javascript goes here/*]]>*/</script>
et mon javascript comprend juste que séquence de! J'aime l'idée de diviser en plusieurs sections CDATA ...]${1:Delete me then move along--required to escape CDATA end-tag}]>
. Outils > Nouveau Fragment de code... m'agace, parce que l'impression de l'extrait de code de modèle dans un nouveau fichier. Je ne veux pas d'un nouveau fichier, j'ai donc simplement dupliqué le vide extrait de texte dans un autre fichier d'extrait...d'où le besoin.[[United States dollar|US$]]>100 million (2013)
qui a été traduit à[[United States dollar|US$]]>100 million (2013)
par le lecteur et l'écrivain ont opté pour l'utilisation CDATA pour échapper au texte et a échoué.it's just a way to serialize XML text
ou binaire (non imprimable) de données. re:Characters entities is the simplest, most robust and most general solution
pour le texte qui pourraient confondre l'analyseur XML, mais si il y en a beaucoup, il peut être plus efficace de l'espace à utiliser CDATA.If you use a proper XML library
et une bibliothèque digne de ce nom aura méthodes pour ajouter CDATA (imprimable ou non imprimable), qui traitera de l'évasion pour vous, s'il le faut. À l'aide d'une bibliothèque digne de ce nom est certainement le chemin à parcourir.Characters entities is the simplest, most robust and most general solution, so use that instead of CDATA sections. If you use a proper XML library (instead of building XML out of strings) you don't even have to think about it.
j'ai été acceptez que l'utilisation d'une bibliothèque digne de ce nom a été meilleure que la construction d'XML à la main, mais en désaccord que les entités sont toujours, la plus robuste, car si vous avez beaucoup, puis une CDATA est plus efficace. De toute façon unproper library
s'en chargera pour vous. Etgzip
rend les données binaires qui a vraiment besoin CDATA.Vous devez briser vos données en morceaux afin de dissimuler la
]]>
.Voici la chose:
<![CDATA[]]]]><![CDATA[>]]>
La première
<![CDATA[]]]]>
a la]]
. La deuxième<![CDATA[>]]>
a la>
.]]>
comme]]]]><![CDATA[>
. 5 fois la longueur... wow. Mais alors, il est rare qu'une séquence.if(fields[fieldnames[0]] >3)
, ou deux espaces autour de>
, mais cela rend automatique JS minification plus difficile. (>
et>>
opérateurs?).a='<scr'+'ipt>'
oufoo.com/bar%20gaz
s'échapper, tout simplement parce que bien que linguistiquement précises, il n'est pas l'exacte nomenclature technique. Oui il y a plusieurs sections CDATA, et oui, dans de rares cas, des questions. Mais, selon Oxford la définition large de l'informatique est de "causer des caractère(s) d'interpréter différemment". Dans ce cas et les cas mentionnés, il arrive.Vous n'échappent pas à la
]]>
mais vous échapper à la>
après]]
par l'insertion,]]><![CDATA[
avant la>
, pensez à ceci comme un\
en C/Java/PHP/Perl chaîne, mais seulement nécessaire avant de>
et après un]]
.BTW,
S. Lott la réponse est la même comme cela, il suffit de libellée différemment.
]]]]><![CDATA[>
n'est pas une suite magique pour]]>
.]]]]>
a]]
personnages de données, et]]>
met fin à une section CDATA.<![CDATA[>
commence une nouvelle section CDATA et met>
en elle. Ils sont en fait deux éléments différents et seront traités différemment lorsque l'on travaille avec un DOM parser. Vous devriez être conscient de cela. Cette façon de faire, il est semblable à]]]><![CDATA[]>
, sauf qu'il met]
dans la première et la]>
dans la deuxième CDATA. La différence reste.S. Lott la réponse est juste: vous n'avez pas encoder la balise de fin, vous cassez travers de multiples sections CDATA.
Comment exécuter sur ce problème dans le monde réel: à l'aide d'un éditeur XML pour créer un document XML qui seront introduits dans un système de gestion de contenu, essayez d'écrire un article sur les sections CDATA. Votre ordinaire truc de l'incorporation des exemples de code dans une section CDATA échouera vous ici. Vous pouvez imaginer comment j'ai appris cela.
Mais dans la plupart des cas, vous ne rencontrerez pas de cela, et voici pourquoi: si vous voulez enregistrer (par exemple) le texte d'un document XML comme le contenu d'un élément XML, vous aurez probablement utiliser une méthode DOM, par exemple:
Et les DOM très raisonnablement s'échappe de l' < et >, ce qui signifie que vous n'avez pas par inadvertance a incorporé une section CDATA dans votre document.
Oh, et c'est intéressant:
C'est probablement une ideosyncrasy de la .NET DOM, mais qui ne lance pas d'exception. L'exception est lancée ici:
Je suppose que ce qui se passe sous le capot, c'est que le XmlDocument est à l'aide d'un XmlWriter produire sa sortie, et le XmlWriter vérifie les documents bien-formés comme il écrit.
il suffit de remplacer
]]>
avec]]]]><![CDATA[>
Voici un autre cas d'
]]>
doit être échappé. Supposons que nous avons besoin d'enregistrer un bon document HTML à l'intérieur d'un bloc CDATA d'un document XML et le code source HTML qui arrive à avoir son propre bloc CDATA. Par exemple:le commentaire CDATA suffixe doit être modifié pour:
depuis un analyseur XML n'est pas de savoir comment gérer le javascript blocs de commentaires
]]>
avec]]]]><![CDATA[>
s'applique encore ici. Le fait que c'est du JavaScript, ou de commentaire n'est pas important.En PHP:
'<![CDATA['.implode(explode(']]>', $string), ']]]]><![CDATA[>').']]>'
D'une façon plus propre en PHP:
N'oubliez pas d'utiliser un multi-octets sûr str_replace si nécessaire (non latin1
$string
):Une autre solution est de remplacer
]]>
par]]]><![CDATA[]>
.]]]]><![CDATA[>
Voir cette structure:
Pour l'intérieure de la balise CDATA(s), vous devez fermer avec
]]]]><![CDATA[>
au lieu de]]>
. Simple que cela.