De quels caractères ai-je besoin pour m'échapper dans les documents XML?


Réponses:


1356

Si vous utilisez une classe ou une bibliothèque appropriée, ils feront l'échappement pour vous. De nombreux problèmes XML sont dus à la concaténation de chaînes.

Caractères d'échappement XML

Il n'y en a que cinq:

"   "
'   '
<   &lt;
>   &gt;
&   &amp;

Les caractères d'échappement dépendent de l'endroit où le caractère spécial est utilisé.

Les exemples peuvent être validés auprès du service de validation de balisage W3C .

Texte

Le moyen sûr consiste à échapper aux cinq caractères du texte. Cependant, les trois personnages ", 'et >n'a pas besoin d' être échappé dans le texte:

<?xml version="1.0"?>
<valid>"'></valid>

Les attributs

Le moyen sûr consiste à échapper aux cinq caractères dans les attributs. Cependant, le >caractère n'a pas besoin d'être échappé dans les attributs:

<?xml version="1.0"?>
<valid attribute=">"/>

Le 'caractère ne doit pas être échappé dans les attributs si les guillemets sont ":

<?xml version="1.0"?>
<valid attribute="'"/>

De même, il "n'est pas nécessaire d'échapper les attributs si les guillemets sont ':

<?xml version="1.0"?>
<valid attribute='"'/>

commentaires

Les cinq caractères spéciaux ne doivent pas être échappés dans les commentaires:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

CDATA

Les cinq caractères spéciaux ne doivent pas être échappés dans les sections CDATA :

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

Instructions de traitement

Les cinq caractères spéciaux ne doivent pas être échappés dans les instructions de traitement XML:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML vs HTML

HTML a son propre ensemble de codes d'échappement qui couvrent beaucoup plus de caractères.


33
@Pacerier, je vous prie de ne pas écrire votre propre code d'échappement XML / HTML. Utilisez une fonction de bibliothèque ou vous risquez de manquer un cas spécial.
Jason

5
Pour les sauts de ligne, vous devez également utiliser & # xA; & # xD; et & # x9; pour l'onglet, si vous avez besoin de ces caractères dans un attribut.
radistao

78
Si vous voulez faire une recherche / remplacement sur ces derniers, n'oubliez pas de faire le & amp; remplacement avant les autres.
Doug

2
@Doug J'étais sur le point de mentionner exactement la même chose - sinon tous les autres personnages remplacés seront corrompus, et des choses comme ça &quot;seront changées en&amp;quot;
Jerry Dodge

5
De Wikipedia: "Tous les caractères Unicode autorisés peuvent être représentés avec une référence de caractère numérique." Il y en a donc beaucoup plus que 5.
Tim Cooper

93

Peut-être que cela aidera:

Liste des références d'entités de caractères XML et HTML :

Dans les documents SGML, HTML et XML, les constructions logiques appelées données de caractères et valeurs d'attributs sont constituées de séquences de caractères, dans lesquelles chaque caractère peut se manifester directement (se représenter lui-même) ou être représenté par une série de caractères appelée référence de caractère, dont il existe deux types: une référence de caractère numérique et une référence d'entité de caractère. Cet article répertorie les références d'entité de caractère qui sont valides dans les documents HTML et XML.

Cet article répertorie les cinq entités XML prédéfinies suivantes:

quot  "
amp   &
apos  '
lt    <
gt    >

73

Selon les spécifications du World Wide Web Consortium (w3C), il y a 5 caractères qui ne doivent pas apparaître sous leur forme littérale dans un document XML , sauf lorsqu'ils sont utilisés comme délimiteurs de balisage ou dans un commentaire, une instruction de traitement ou une section CDATA . Dans tous les autres cas, ces caractères doivent être remplacés soit en utilisant l'entité correspondante, soit la référence numérique selon le tableau suivant:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

Notez que les entités susmentionnées peuvent également être utilisées en HTML, à l'exception de & apos; , qui a été introduit avec XHTML 1.0 et n'est pas déclaré en HTML 4. Pour cette raison, et pour garantir la rétrocompatibilité, la spécification XHTML recommande l'utilisation de & # 39; au lieu.


14
XML prédéfinit ces cinq entités, mais il ne précise absolument PAS que vous ne pouvez utiliser aucun de ces cinq caractères dans leur forme littérale. <et & doivent être échappés partout (sauf CDATA). "et 'ne doivent être échappés que dans les valeurs d'attribut, et uniquement si le caractère de citation correspondant est le même. Et> n'a jamais réellement à être échappé.
Shaun McCance

3
Comme indiqué ci-dessus, <> "& 'ne doit pas être échappé lorsqu'il est utilisé comme délimiteurs de balisage ou dans un commentaire, une instruction de traitement ou une section CDATA. Par exemple, lorsque vous utilisez <> comme balise XML, vous n'y échappez pas. . Même chose pour un commentaire (échapperiez-vous à un & dans une ligne commentée d'un fichier XML? Vous n'en avez pas besoin, et votre XML est toujours valide si vous ne le faites pas). Ceci est clairement spécifié dans les recommandations officielles pour XML par le W3C .
Albz

7
@ShaunMcCance >doit être échappé s'il suit ]]dans le contenu, sauf s'il est destiné à faire partie du ]]>délimiteur qui indique la fin d'une section CDATA.
Lee D

2
Ne pas être un nécromancien, mais @Albz a tort de dire que ces caractères DOIVENT être autorisés dans le contenu. Voir la section 2.4 sur w3.org/TR/REC-xml/#NT-CharData . La version TL; DR de cela est celle du contenu de l'élément chardata, & amp; et & lt; doivent toujours être autorisés. Le & gt; le caractère PEUT être autorisé, bien qu'il DOIT l'être lors de son apparition dans la chaîne littérale "]]>" car sinon cela sera lu comme terminant une section CDATA. Pour les guillemets simples et doubles, vous pouvez vous échapper si vous le souhaitez. C'est tout, pour les chardata à l'intérieur des éléments. D'autres composants de XML ont d'autres règles.
skye --- capitaine

52

Les caractères d'échappement sont différents pour les balises et les attributs.

Pour les tags:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

Pour les attributs:

" &quot;
' &apos;

À partir des données de personnage et du balisage :

Le caractère esperluette (&) et le crochet angulaire gauche (<) ne doivent pas apparaître dans leur forme littérale, sauf lorsqu'ils sont utilisés comme délimiteurs de balisage, ou dans un commentaire, une instruction de traitement ou une section CDATA. S'ils sont nécessaires ailleurs, ils doivent être échappés à l'aide des références de caractères numériques ou des chaînes "& amp;" et "& lt;" respectivement. Le crochet à angle droit (>) peut être représenté à l'aide de la chaîne "& gt;" et doit, pour des raisons de compatibilité, être échappé à l'aide de "& gt;" ou d'une référence de caractère lorsqu'il apparaît dans la chaîne "]]>" dans le contenu, lorsque cette chaîne ne marque pas la fin d'une section CDATA.

Pour permettre aux valeurs d'attribut de contenir à la fois des guillemets simples et doubles, l'apostrophe ou le caractère guillemet simple (') peut être représenté comme "& apos;", et le caractère guillemet double (") comme" & quot; ".


Cela implique que pour les attributs, seuls les guillemets doivent être échappés, mais cela s'ajoute aux trois autres caractères
eug

40

Nouvelle réponse simplifiée à une ancienne question fréquemment posée ...

Échappement XML simplifié (priorisé, 100% terminé)

  1. Toujours (90% important à retenir)

    • Échapper <comme à &lt;moins que ne <démarre a <tag/>.
    • Échapper &à &amp;moins que ne &démarre un &entity;.
  2. Valeurs d'attribut (9% important à retenir)

    • attr=" 'Les guillemets simples 'sont corrects entre guillemets doubles."
    • attr=' "Les guillemets doubles "sont acceptables dans les guillemets simples.'
    • Évadez "comme &quot;et 'que le &apos;contraire.
  3. Commentaires , CDATA et instructions de traitement (0,9% important à retenir)

    • <!--Dans les commentaires, --> rien ne doit être échappé mais aucune --chaîne n'est autorisée.
    • <![CDATA[Dans CDATA, ]]> rien ne doit être échappé, mais aucune ]]>chaîne n'est autorisée.
    • <?PITargetDans les PI, ?> rien ne doit être échappé, mais aucune ?>chaîne n'est autorisée.
  4. Ésotérique (0,1% important à retenir)

    • Échapper ]]>comme à ]]&gt;moins que ne ]]>se termine une section CDATA.
      (Cette règle s'applique aux données de caractères en général - même en dehors d'une section CDATA.)

Une autre règle à noter: ]]>doit être échappée car ]]&gt;, même lorsqu'elle n'est pas dans une section CDATA. Le moyen le plus simple d'y parvenir est de toujours s'échapper en >tant que &gt;.
Michael Kay

Merci, @MichaelKay. J'ai incorporé votre note utile sur, ]]> mais j'ai choisi de la reléguer à l'ésotérique plutôt que de suggérer de > toujours échapper (ce qui n'est pas nécessaire, comme vous le savez). Mon objectif ici est de rendre les règles d'échappement XML facilement mémorisables et 100% précises .
kjhughes

Les réponses ci-dessus, y compris une mention acceptée, mentionnent les cinq caractères dans les attributs. Avez-vous une référence à la norme XML pour appuyer ce que vous dites, car votre réponse semble logiquement être la bonne?
Roman Susi

1
@RomanSusi: Oui, de nombreuses autres réponses contiennent des erreurs ou des généralisations excessives ("La manière sûre ...") basées sur du ouï-dire, une mauvaise interprétation ou une mauvaise compréhension du BNF XML officiel. Ma réponse est (a) 100% justifiée par la recommandation XML du W3C; voir les nombreuses références liées à la BNF officielle, et (b) organisées dans une progression concise, logique et facilement mémorisable de ces exigences.
kjhughes

@RomanSusi: La déclaration spécifique selon laquelle "les cinq caractères doivent être échappés à l'intérieur des attributs" est une indication bâclée non prise en charge par la règle officielle BNF AttValuecitée dans ma réponse via un lien sur 2. Valeurs d'attribut .
kjhughes

25

En plus des cinq caractères connus [<,>, &, "et '], j'échapperais également au caractère de tabulation verticale (0x0B). Il s'agit d'un UTF-8 valide, mais pas d'un XML 1.0 valide, et même de nombreuses bibliothèques (y compris la bibliothèque hautement portable (ANSI C) libxml2 ) le manque et génère silencieusement du XML invalide.


11

Abrégé de: XML, Escaping

Il existe cinq entités prédéfinies:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

"Tous les caractères Unicode autorisés peuvent être représentés avec une référence numérique." Par exemple:

&#20013;

La plupart des caractères de contrôle et des autres plages Unicode sont spécifiquement exclus, ce qui signifie (je pense) qu'ils ne peuvent pas se produire ni échappés ni directs:

Caractères valides en XML


3

Ça dépend du contexte. Pour le contenu, c'est < et & , et ]]> (bien qu'une chaîne de trois au lieu d'un caractère).

Pour les valeurs d'attribut, il s'agit de < , & , " et ' .

Pour CDATA, c'est ]]> .


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.