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.


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 &.


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.


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 &.


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. >>
 ]]>

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.


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.


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?


4

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


3

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


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.


2
Penso que este terreno foi bem coberto nos 7 anos anteriores à publicação desta resposta.
— precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.