Estou trabalhando com algum XML que contém seqüências de caracteres como:
<node>This is a string</node>
Algumas das cordas que estou passando para os gânglios terá personagens como &
, #
, $
, etc .:
<node>This is a string & so is this</node>
Isso não é válido devido a &
.
Não consigo agrupar essas seqüências no CDATA, pois elas precisam ser como são. Tentei procurar uma lista de caracteres que não podem ser colocados em nós XML sem estar em um CDATA.
Alguém pode me apontar na direção de um ou fornecer uma lista de caracteres ilegais?
Respostas:
Os únicos caracteres ilegais são
&
,<
e>
(assim como"
ou'
nos atributos).Eles escaparam usando XML entidades , neste caso você deseja
&
para&
.Na verdade, você deve usar uma ferramenta ou biblioteca que grave XML para você e abstraia esse tipo de coisa, para que você não precise se preocupar com isso.
fonte
OK, vamos separar a questão dos caracteres que:
A resposta fornecida por @dolmen em " O que são caracteres inválidos no XML " ainda é válida, mas precisa ser atualizada com a especificação XML 1.1.
1. Caracteres inválidos
Os caracteres descritos aqui são todos os caracteres que podem ser inseridos em um documento XML.
1.1 No XML 1.0
A lista global de caracteres permitidos é:
Basicamente, os caracteres de controle e caracteres fora dos intervalos Unicode não são permitidos. Isso significa também que

é proibido chamar, por exemplo, a entidade de caractere .1.2 No XML 1.1
A lista global de caracteres permitidos é:
Esta revisão da recomendação XML estendeu os caracteres permitidos para que caracteres de controle sejam permitidos e leva em consideração uma nova revisão do padrão Unicode, mas esses ainda não são permitidos: NUL (x00) , xFFFE , xFFFF ...
No entanto, o uso de caracteres de controle e caracteres Unicode indefinidos é desencorajado.
Também é possível notar que nem todos os analisadores levam isso em consideração e os documentos XML com caracteres de controle podem ser rejeitados.
2. Caracteres que precisam ser escapados (para obter um documento bem formado):
O
<
deve ser escapado com uma<
entidade, pois é assumido o início de uma tag.A
&
devem ser precedidos por uma&
entidade, uma vez que se presume ser o início de uma referência de entidadeO
>
deve ser escapado com a>
entidade. Não é obrigatório - depende do contexto - mas é altamente recomendável evitá-lo.Ele
'
deve ser escapado com uma'
entidade - obrigatório nos atributos definidos entre aspas simples, mas é altamente recomendável sempre escapá-lo.Ele
"
deve ser escapado com uma"
entidade - obrigatório nos atributos definidos entre aspas duplas, mas é altamente recomendável sempre escapá-lo.fonte
A lista de caracteres válidos está na especificação XML :
fonte
& < > " '
precisam ser escapados em determinados contextos.Este é um código C # para remover os caracteres inválidos de XML de uma string e retornar uma nova string válida.
fonte
\u10000
e tenha\u10FFFF
caracteres tão únicos quanto eles exigem duaschar
instâncias utf-16 cada e, de acordo com os documentos , pode não haver mais do que 4 dígitos.[\u10000-\u10FFFF]
é mais provável analisado como [\u1000
,0-\u10FF
,F
,F
] o que é estranho à procura, mas legal.Os caracteres pré-declarados são:
Consulte " Quais são os caracteres especiais em XML? " Para obter mais informações.
fonte
Além da resposta da potame, se você quiser escapar usando um bloco CDATA.
Se você colocar seu texto em um bloco CDATA, não precisará usar escape . Nesse caso, você pode usar todos os caracteres no seguinte intervalo :
Nota: Além disso, você não tem permissão para usar a
]]>
sequência de caracteres. Porque corresponderia ao final do bloco CDATA.Se ainda houver caracteres inválidos (por exemplo, caracteres de controle), provavelmente é melhor usar algum tipo de codificação (por exemplo, base64).
fonte
Outra maneira fácil de escapar de caracteres XML / XHTML potencialmente indesejados em C # é:
fonte
Outra maneira de remover caracteres XML incorretos em C # está usando
XmlConvert.IsXmlChar
(Disponível desde o .NET Framework 4.0)ou você pode verificar se todos os caracteres são válidos para XML:
.Net Fiddle
Por exemplo, o símbolo da guia vertical (
\v
) não é válido para XML, é válido UTF-8, mas não é válido para XML 1.0 e até mesmo muitas bibliotecas (incluindo a libxml2) o perdem e emitem XML inválido silenciosamente.fonte
Em resumo, os caracteres válidos no texto são:
&
e<
.>
não é válido se a seguir]]
.As seções 2.2 e 2.4 da especificação XML fornecem a resposta em detalhes:
Personagens
Dados do personagem
fonte
" XmlWriter e caracteres ASCII inferiores " funcionou para mim
fonte
Em C #, use
System.Security.SecurityElement.Escape
ouSystem.Net.WebUtility.HtmlEncode
para escapar desses caracteres ilegais.fonte
Para o pessoal de Java, o Apache possui uma classe de utilitário (
StringEscapeUtils
) que possui um método auxiliarescapeXml
que pode ser usado para escapar caracteres em uma string usando entidades XML.fonte
No processador XML Woodstox, caracteres inválidos são classificados por este código:
Fonte daqui
fonte
Alguém tentou isso
System.Security.SecurityElement.Escape(yourstring)
? Isso substituirá caracteres XML inválidos em uma sequência pelo seu equivalente válido.fonte
Para XSL (em dias realmente preguiçosos) eu uso:
traduzir todos os sinais & que não são seguidos på amp; para os adequados.
Temos casos em que a entrada está no CDATA, mas o sistema que usa o XML não leva em consideração. É uma correção desleixada, cuidado ...
fonte