Como escapar de e comercial em XML para que eles sejam renderizados como entidades em HTML?

523

Eu tenho algum texto XML que desejo renderizar em uma página HTML. Este texto contém um e comercial, o que eu quero para processar em sua representação entidade: &.

Como escapar desse e comercial no XML de origem? Eu tentei &, mas isso é decodificado como o caractere comercial real ( &), que é inválido no HTML .

Então, eu quero evitá-lo de tal maneira que seja renderizado como &na página da web que usa a saída XML.

AJM
fonte
1
A alegação na revisão mais recente desta pergunta de que "o caractere comercial real (&) ... é inválido em HTML". é falso. De fato, mesmo a resposta aceita para a pergunta vinculada, fornecida como justificativa, declara "HTML5 permite que você a deixe sem escape, mas somente quando os dados a seguir não parecerem uma referência de caractere válida" .
Mark Amery

Respostas:

422

Quando o seu XML contiver &, isso resultará no texto &.

Quando você usa isso em HTML, isso será renderizado como &.

Wim ten Brink
fonte
195

Conforme §2.4 da especificação XML 1.0 , você deve poder usar &.

Eu tentei & amp; mas isso não é permitido.

Tem certeza de que não é um problema diferente? O XML define explicitamente isso como a maneira de escapar do e comercial.

John Feminella
fonte
3
Isso foi perfeitamente razoável quando publicado, mas as alterações (ou talvez os esclarecimentos) da pergunta já fizeram com que parecesse absurdo como resposta. Por um lado, a passagem citada não está mais presente na questão.
Mark Amery
133

O &caractere é ele próprio um caractere de escape em XML, portanto a solução é concatená-lo e um equivalente decimal em Unicode para &garantir, assim, que não haja erros de análise de XML. Ou seja, substitua o caractere &por &.

problema
fonte
5
Eu realmente prefiro esta solução! Também deve ser possível usar a notação hexadecimal:&
CodeManX
2
Logicamente, por que isso funcionaria? Ambas as cadeias têm um e comercial, incluindo aquele com o código de caracteres no final ...
sijpkes
4
@sijpkes Como o e comercial aqui informa ao analisador que os seguintes caracteres são usados ​​para representar outro caractere, que nesse caso seria um e comercial. Um "e comercial" não é "ilegal" em XML - apenas possui um significado especial. Significa "todos os caracteres depois disso até que você atinja um ponto e vírgula devem ser traduzidos para outra coisa". Quando você tem um e comercial normalmente, sem os caracteres descritivos e o ponto e vírgula à direita, o analisador fica confuso.
Riley Maior
1
Esta é a resposta para mim. Adicionando & # 038; no local do meu cabeçalho de resposta o corrigiu e não está mostrando o e comercial no cabeçalho de resposta. : D
iamjoshua 2/08/19
O estouro de pilha é tão bom. Aqui está um post de quase 11 anos que resolve meu problema. E foi visto mais de 690.000 vezes.
Bill
69

Use CDATAtags:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>
scragar
fonte
4
Este é um palpite e não uma resposta.
22909 Bryan Oakley
10
Pode ser um palpite; está correto embora. Os marcadores CDATA permitem o uso de e comercial bruto.
Quentin
19
A postagem original nunca deixou claro onde os & deveriam ser usados; as tags CDATA não podem ser usadas para valores de atributo, apenas para o conteúdo real das tags, portanto, o motivo pelo qual incluí o '?'.
scragar 25/08/09
1
Isso também é ótimo para caracterizar dados xml e essa resposta é útil em muitos outros cenários relacionados à renderização de xml. Para mim, realmente ajudou no DSL XML do Camel, quando eu precisava definir o corpo ou algum cabeçalho com alguns dados XML, o analisador XML do Camel ignorou o conteúdo do CDATA, lendo-o como um fluxo de caracteres. Sem isso o motor camelo gera exceções estrutura XML inválidos
Kimutai
1
Essa é exatamente a resposta que eu precisava, porque no meu caso não tenho certeza de quais caracteres podem estar chegando no XML, portanto, preciso escapar de tudo nessa seção.
Matt
11

No meu caso, tive que mudar para %26.

Eu precisava escapar &em um URL. Então &amp;não deu certo para mim. A função urlencode muda &para %26. Dessa forma, nem o XML nem o mecanismo de URL do navegador reclamaram sobre o URL.

Serhat Akay
fonte
8
Sim. Observe, porém, que o OP era sobre escape em XML. Escapar de um URL é um problema diferente. A verdadeira diversão começa quando você tem URLs em XML ou XML fragmentos em URLs ...
Oskar Berggren
6

Eu tentei & amp, mas não funcionou. Baseado na resposta de Wim ten Brink, tentei & amp; funcionou.

Um dos meus colegas desenvolvedores sugeriu que eu usasse o & # x26; e funcionou independentemente de quantas vezes ele pode ser renderizado.

mcampos
fonte
5

&amp; é a maneira de representar um e comercial na maioria das seções de um documento XML.

Se você deseja exibir o XML no HTML, primeiro é necessário criar o XML codificado corretamente (o que envolve a alteração &para &amp;) e, em seguida, usá-lo para criar o HTML codificado corretamente (o que envolve a alteração novamente &no &amp;). Isso resulta em:

&amp;amp;

Para uma explicação mais completa da codificação XML, consulte:

Quais caracteres eu preciso para escapar nos documentos XML?

Riley Major
fonte
4

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text> fará o truque.

Rick
fonte
3

Que tal usar o unicode \u0026? Funciona para mim nos meus arquivos XML do Android. Se surgirem problemas, alguém me avise.

Scott Biggs
fonte
1
\uescapes não têm significado especial em XML em geral. -1.
Mark Amery
@MarkAmery Sim, eles não têm significados especiais, e é exatamente por isso que funcionam tão bem - não há nada para interpretar, então não há nada que dê errado. O java interpreta o unicode e exibe um "e" comercial exatamente como o OP deseja.
Scott Biggs
1
@ScottBiggs O que o Java tem a ver com a pergunta do OP?
Philippe-André Lorin 22/03
1
@ScottBiggs Portanto, é fora de tópico. - 1.
Philippe-André Lorin 25/03
1
@ScottBiggs O fato de funcionar para você e de que alguns outros possam se beneficiar é irrelevante; sua resposta é barulho para todos os outros leitores. Porque não lida com o caso mais geral sobre o qual o OP perguntou. Não se trata de não compartilhar seu sucesso. Trata-se de mantê-lo onde ele pertence. Sua contribuição pode ser útil, mas não apresentada como resposta aqui. Talvez como um comentário, talvez como uma resposta para outra pergunta (que você pode criar e responder a si mesmo).
Philippe-André Lorin 27/03
0

Considere se o seu XML se parece abaixo.

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

Você não pode usar o <>diretamente, pois gera um erro. Nesse caso, você pode usar &#60;&#62;em substituição a isso.

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

Clique aqui para ver todos os códigos.

Sarath Avanavu
fonte
2
Penso que este terreno foi bem coberto nos 7 anos anteriores à publicação desta resposta.
precisa saber é o seguinte