Quais caracteres eu preciso para escapar nos documentos XML?

Respostas:

1356

Se você usar uma classe ou biblioteca apropriada, eles farão o escape para você. Muitos problemas de XML são causados ​​por concatenação de cadeias.

Caracteres de escape XML

Existem apenas cinco:

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

O escape de caracteres depende de onde o caractere especial é usado.

Os exemplos podem ser validados no Serviço de validação de marcação do W3C .

Texto

A maneira segura é escapar dos cinco caracteres do texto. No entanto, os três personagens ", 'e >não precisa ser escapado no texto:

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

Atributos

A maneira segura é escapar dos cinco caracteres nos atributos. No entanto, o >personagem não precisa ser escapado em atributos:

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

O 'caractere não precisa ser escapado em atributos se as aspas forem ":

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

Da mesma forma, os "atributos não precisam ser escapados se as aspas forem ':

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

Comentários

Todos os cinco caracteres especiais não devem ser escapados nos comentários:

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

CDATA

Todos os cinco caracteres especiais não devem ser escapados nas seções CDATA :

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

Instruções de processamento

Todos os cinco caracteres especiais não devem ser escapados nas instruções de processamento XML:

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

XML vs. HTML

O HTML possui seu próprio conjunto de códigos de escape, que cobrem muito mais caracteres.

Welbog
fonte
33
@ Pacerier, eu imploro para você não escrever seu próprio código de escape XML / HTML. Use uma função de biblioteca ou você perderá um caso especial.
Jason
5
Também para quebras de linha, você precisa usar o & # xA; & # xD; e & # x9; para guia, se você precisar desses caracteres em um atributo.
Radistao 26/11/12
78
Se você for procurar / substituir esses itens, lembre-se de fazer o & amp; substituição antes dos outros.
Doug
2
@Doug eu estava prestes a mencionar a exata mesma coisa - ou então todos os outros caracteres substituídos serão corrompidos, e coisas assim &quot;será alterado para&amp;quot;
Jerry rodeio
5
Da Wikipedia: "Todos os caracteres Unicode permitidos podem ser representados com uma referência numérica." Portanto, há muito mais do que 5.
Tim Cooper
93

Talvez isso ajude:

Lista de referências de entidade de caracteres XML e HTML :

Nos documentos SGML, HTML e XML, as construções lógicas conhecidas como dados de caracteres e valores de atributos consistem em sequências de caracteres, nas quais cada caractere pode se manifestar diretamente (representando a si mesmo) ou pode ser representado por uma série de caracteres chamados de referência de caracteres, dos quais existem dois tipos: uma referência numérica de caracteres e uma referência de entidade de caracteres. Este artigo lista as referências de entidade de caracteres que são válidas em documentos HTML e XML.

Esse artigo lista as cinco entidades XML predefinidas a seguir:

quot  "
amp   &
apos  '
lt    <
gt    >
Andrew Hare
fonte
73

De acordo com as especificações do World Wide Web Consortium (w3C), existem 5 caracteres que não devem aparecer em sua forma literal em um documento XML , exceto quando usados ​​como delimitadores de marcação ou em um comentário, uma instrução de processamento ou uma seção CDATA . Nos demais casos, esses caracteres devem ser substituídos usando a entidade correspondente ou a referência numérica, de acordo com a tabela a seguir:

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

Observe que as entidades acima mencionadas também podem ser usadas em HTML, com exceção de & apos; , que foi introduzido no XHTML 1.0 e não está declarado no HTML 4. Por esse motivo, e para garantir a compatibilidade retroativa, a especificação XHTML recomenda o uso do & # 39; em vez de.

Albz
fonte
14
O XML pré-define essas cinco entidades, mas NÃO especifica absolutamente que você não pode usar nenhum desses cinco caracteres em sua forma literal. <e & precisam ser escapados em qualquer lugar (exceto CDATA). "E" só tem que ser escapado em valores de atributos, e somente se o caractere de aspas correspondente é a mesma E> nunca realmente tem que ser escapado..
Shaun McCance
3
Como escrito acima, <> "& 'não precisam ser escapados quando usados ​​como delimitadores de marcação ou em um comentário, uma instrução de processamento ou uma seção CDATA. Ou seja, quando você usa <> como uma marca XML, não escapa O mesmo para um comentário (você escaparia de um & em uma linha comentada de um arquivo XML? Você não precisa e seu XML ainda é válido se não o fizer). Isso está claramente especificado nas recomendações oficiais para XML por W3C .
Albz 01/10
7
O @ShaunMcCance >deve ser escapado se seguir o ]]conteúdo, a menos que se destine a fazer parte do ]]>delimitador que indica o final de uma seção CDATA.
Lee D
2
Não é um necromante, mas @Albz está incorreto ao dizer que esses caracteres DEVEM ser autorizados no conteúdo. Veja a seção 2.4 em w3.org/TR/REC-xml/#NT-CharData . A versão TL; DR disso é a do conteúdo do elemento chardata, & amp; e & lt; sempre deve ser autorizado. O & gt; O caractere PODE ser autorizado, embora DEVE ser ao aparecer na string literal “]]>” porque, caso contrário, isso será lido como terminando uma seção CDATA. Para aspas simples e aspas duplas, você pode escapar se quiser. É isso, para chardata dentro de elementos. Outros componentes do XML têm outras regras.
skye --- capitão
52

O escape de caracteres é diferente para tags e atributos.

Para tags:

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

Para atributos:

" &quot;
' &apos;

De dados e marcação de caracteres :

O caractere e comercial (&) e o colchete angular esquerdo (<) não devem aparecer em sua forma literal, exceto quando usados ​​como delimitadores de marcação, ou dentro de um comentário, uma instrução de processamento ou uma seção CDATA. Se forem necessários em outro lugar, eles devem ser escapados usando referências de caracteres numéricos ou as cadeias "& amp;" e "& lt;" respectivamente. O colchete de ângulo reto (>) pode ser representado usando a string "& gt;" e, para compatibilidade, deve ser escapado usando "& gt;" ou uma referência de caractere quando aparecer na string "]]>" no conteúdo, quando essa sequência não está marcando o final de uma seção CDATA.

Para permitir que os valores dos atributos contenham aspas simples e duplas, o caractere de apóstrofo ou aspas simples (') pode ser representado como "&"; e o caractere de aspas duplas (") como" & quot; "

Peter Bartels
fonte
Isto implica que para os atributos única citações precisam ser escapou, mas que é, além de outros três personagens
eug
40

Resposta nova e simplificada a uma pergunta antiga e comum ...

Escapamento XML simplificado (priorizado, 100% completo)

  1. Sempre (90% importante lembrar)

    • Escape <como a &lt;menos que <esteja iniciando a <tag/>.
    • Escape &como a &amp;menos que &esteja iniciando um &entity;.
  2. Valores de Atributos (9% importantes para lembrar)

    • attr=" 'Aspas simples 'são válidas entre aspas duplas."
    • attr=' "Aspas duplas "são válidas entre aspas simples.'
    • Escapar "como &quot;e 'como &apos;de outro modo.
  3. Comentários , CDATA e Instruções de Processamento (0,9% é importante lembrar)

    • <!--Nos comentários, --> nada precisa ser escapado, mas nenhuma --string é permitida.
    • <![CDATA[No CDATA, ]]> nada precisa ser escapado, mas nenhuma ]]>string é permitida.
    • <?PITargetDentro dos PIs, ?> nada precisa ser escapado, mas nenhuma ?>string é permitida.
  4. Esoterica (0,1% importante lembrar)

    • Escape ]]>como a ]]&gt;menos que ]]>esteja terminando uma seção CDATA.
      (Esta regra se aplica a dados de caracteres em geral - mesmo fora de uma seção CDATA.)
kjhughes
fonte
Uma outra regra que vale a pena notar: ]]>deve ser escapada como ]]&gt;, mesmo quando não estiver em uma seção CDATA. A maneira mais fácil de conseguir isso pode ser sempre escapar >como &gt;.
Michael Kay
Obrigado, @ MichaelKay. Eu incorporei sua observação útil sobre, ]]> mas optei por relegá-la à esotérica, em vez de sugerir que > sempre escape (o que não é necessário, como você sabe). Meu objetivo aqui é tornar as regras de escape do XML facilmente lembradas e 100% precisas .
precisa saber é o seguinte
As respostas acima, incluindo uma menção aceita, todos os cinco caracteres devem ser escapadas dentro dos atributos. Você tem alguma referência ao padrão XML para apoiar o que está dizendo, pois sua resposta parece ser a correta?
Roman Susi
1
@RomanSusi: Sim, muitas outras respostas contêm erros ou generalizações excessivas ("O caminho seguro ...") com base em boatos, más interpretações ou mal-entendidos do XML BNF oficial. Minha resposta é (a) 100% justificada pela Recomendação XML do W3C; veja as muitas referências vinculadas ao BNF oficial e (b) organizadas em uma progressão concisa, lógica e facilmente lembrada desses requisitos.
kjhughes
@RomanSusi: A afirmação específica de que "todos os cinco caracteres devem ser escapados dentro dos atributos" é uma orientação superficial, não suportada pela regra oficial da BNF, AttValuecitada na minha resposta por meio de um link em 2. Valores dos Atributos .
kjhughes
25

Além dos cinco caracteres comumente conhecidos [<,>, &, "e '], eu também escaparia do caractere de tabulação vertical (0x0B). Ele é válido UTF-8, mas não é válido XML 1.0 e até muitas bibliotecas (incluindo a biblioteca altamente portátil (ANSI C) libxml2 ) perde e gera XML inválido silenciosamente.

Charon ME
fonte
11

Abreviado de: XML, Escapando

Existem cinco entidades predefinidas:

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

"Todos os caracteres Unicode permitidos podem ser representados com uma referência numérica." Por exemplo:

&#20013;

A maioria dos caracteres de controle e outros intervalos Unicode são especificamente excluídos, o que significa (eu acho) que eles não podem ocorrer como escapados ou diretos:

Caracteres válidos em XML

Tim Cooper
fonte
3

Depende do contexto. Para o conteúdo, são < e & , e ]]> (embora uma sequência de três em vez de um caractere).

Para valores de atributo, são < , & , " e ' .

Para CDATA, é ]]> .

把 友情 留 在 无 盐
fonte