Comment puis-je échapper des esperluettes en XML afin qu'elles soient rendues comme des entités en HTML?

524

J'ai du texte XML que je souhaite afficher dans une page HTML. Ce texte contient une esperluette, que je veux rendre dans sa représentation d' une entité: &.

Comment échapper à cette esperluette dans le XML source? J'ai essayé &, mais cela est décodé en tant que caractère esperluette ( &), qui n'est pas valide en HTML .

Je veux donc y échapper de telle manière qu'il sera rendu comme &dans la page Web qui utilise la sortie XML.

AJM
la source
1
L'affirmation dans la dernière révision de cette question selon laquelle "le caractère esperluette réel (&) ... n'est pas valide en HTML". c'est faux. En effet, même la réponse acceptée à la question liée fournie comme justification indique "HTML5 vous permet de le laisser sans échappatoire, mais uniquement lorsque les données qui suivent ne ressemblent pas à une référence de caractère valide" .
Mark Amery

Réponses:

422

Lorsque votre XML contient &, cela se traduira par le texte &.

Lorsque vous utilisez cela en HTML, cela sera rendu sous la forme &.

Wim ten Brink
la source
195

Conformément au §2.4 de la spécification XML 1.0 , vous devriez pouvoir l'utiliser &.

J'ai essayé & amp; mais ce n'est pas autorisé.

Êtes-vous sûr que ce n'est pas un problème différent? XML définit explicitement cela comme le moyen d'échapper aux esperluettes.

John Feminella
la source
3
Cela était parfaitement raisonnable lors de la publication, mais des changements (ou peut-être des clarifications) à la question depuis ont rendu cette réponse absurde. D'une part, le passage cité n'est plus présent dans la question.
Mark Amery
133

Le &caractère est lui-même un caractère d'échappement en XML, la solution consiste donc à le concaténer et un équivalent décimal Unicode pour &garantir ainsi qu'il n'y a pas d'erreurs d'analyse XML. Autrement dit, remplacez le caractère &par &.

difficulté
la source
5
Je préfère vraiment cette solution! Il devrait également être possible d'utiliser la notation hexadécimale:&
CodeManX
2
Logiquement, pourquoi cela fonctionnerait-il? Les deux chaînes ont une esperluette, y compris celle avec le code de caractère à la fin ...
sijpkes
4
@sijpkes Parce que l'esperluette indique ici à l'analyseur que les caractères suivants sont utilisés pour représenter un autre caractère, qui dans ce cas serait une esperluette. Une esperluette n'est pas «illégale» en XML - elle a juste une signification spéciale. Cela signifie "tous les caractères après cela jusqu'à ce que vous frappiez un point-virgule doivent être traduits en autre chose". Lorsque vous avez une esperluette normalement, sans les caractères descriptifs et le point-virgule de fin, l'analyseur est confus.
Riley Major
1
Ceci est la réponse pour moi. Ajout de & # 038; dans l'emplacement de mon en-tête de réponse l'a corrigé et n'affiche pas l'esperluette sur l'en-tête de réponse. : D
iamjoshua
Stack Overflow est tellement génial. Voici un article de presque 11 ans qui résout mon problème. Et il a été vu plus de 690 000 fois.
Bill
69

Utilisez des CDATAbalises:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>
scragar
la source
4
C'est une supposition plutôt qu'une réponse.
Bryan Oakley
10
Ce pourrait être une supposition; c'est correct cependant. Les marqueurs CDATA permettent d'utiliser des esperluettes brutes.
Quentin
19
Le message d'origine n'a jamais précisé où le & devait être utilisé, les balises CDATA ne peuvent pas être utilisées pour les valeurs d'attribut, uniquement pour le contenu réel des balises, d'où la raison pour laquelle j'ai inclus le «?».
scragar
1
C'est également idéal pour caractériser les données xml et cette réponse est utile dans de nombreux autres scénarios concernant le rendu xml. Pour moi, cela a vraiment aidé dans Camel XML DSL, lorsque j'avais besoin de définir le corps ou un en-tête avec des données XML, l'analyseur XML Camel a ignoré le contenu CDATA, les lisant comme un flux de caractères. Sans cela, le moteur de chameau lève des exceptions de structure xml non valides
Kimutai
1
C'est exactement la réponse dont j'avais besoin, car dans mon cas, je ne sais pas quels caractères pourraient apparaître dans le XML, donc je dois tout échapper dans cette section.
Matt
11

Dans mon cas, j'ai dû le changer en %26.

J'avais besoin de m'échapper &dans une URL. Donc ça &amp;n'a pas marché pour moi. La urlencode fonction change &à %26. De cette façon, ni XML ni le mécanisme d'URL du navigateur ne se plaignaient de l'URL.

Serhat Akay
la source
8
Oui. Notez cependant que l'OP consistait à s'échapper en XML. S'échapper dans une URL est un problème différent. Le vrai plaisir commence lorsque vous avez des URL en XML ou des fragments XML en URL ...
Oskar Berggren
6

J'ai essayé et ampli, mais cela n'a pas fonctionné. Sur la base de la réponse de Wim ten Brink, j'ai essayé & amp; amp et cela a fonctionné.

Un de mes collègues développeurs m'a proposé d'utiliser & # x26; et cela a fonctionné quel que soit le nombre de fois où il peut être rendu.

mcampos
la source
5

&amp; est le moyen de représenter une esperluette dans la plupart des sections d'un document XML.

Si vous voulez que XML soit affiché dans HTML, vous devez d'abord créer du XML correctement encodé (ce qui implique de passer &à &amp;), puis l' utiliser pour créer du HTML correctement encodé (ce qui implique à nouveau de changer &en &amp;). Cela se traduit par:

&amp;amp;

Pour une explication plus approfondie du codage XML, voir:

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

Riley Major
la source
4

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> fera l'affaire.

Meule
la source
3

Que diriez-vous d'utiliser l'unicode \u0026? Fonctionne pour moi dans mes fichiers XML Android. Si des problèmes surviennent, quelqu'un me le fait savoir.

Scott Biggs
la source
1
\ules échappements n'ont aucune signification particulière dans XML en général. -1.
Mark Amery
@MarkAmery Oui, ils n'ont pas de signification particulière, c'est précisément pourquoi ils fonctionnent si bien - il n'y a rien à interpréter, donc il n'y a rien à se tromper. La java interprète l'unicode et affiche une esperluette exactement comme l'OP le souhaite.
Scott Biggs
1
@ScottBiggs Qu'est-ce que Java a à voir avec la question de l'OP?
Philippe-André Lorin
1
@ScottBiggs C'est donc hors sujet. - 1.
Philippe-André Lorin
1
@ScottBiggs Le fait que cela fonctionne pour vous et que d'autres puissent en bénéficier n'est pas pertinent; votre réponse est du bruit pour tous les autres lecteurs. Parce qu'il ne s'agit pas du cas plus général sur lequel le PO a posé des questions. Il ne s'agit pas de ne pas partager votre réussite. Il s'agit de le garder à sa place. Votre contribution pourrait être utile, mais pas présentée comme une réponse ici. Peut-être comme un commentaire, peut-être comme une réponse à une autre question (que vous êtes libre de créer et de répondre vous-même).
Philippe-André Lorin
0

Vérifiez si votre XML ressemble à ci-dessous.

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES<>'GCF'
  <Query>
</Employees>

Vous ne pouvez pas utiliser le <>directement car il génère une erreur. Dans ce cas, vous pouvez utiliser &#60;&#62;en remplacement de cela.

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES &#60;&#62; 'GCF'
  <Query>
</Employees>

Cliquez ici pour voir tous les codes.

Sarath Avanavu
la source
2
Je pense que ce motif a été bien couvert au cours des 7 années précédant la publication de cette réponse.
miken32