Encode XML com C#

Em um documento XML, existe alguns caracteres especiais que delimitam os elementos, atributos e valores. Quando a informação contida neles se utiliza desses caracteres especiais, o documento XML é corrompido, pois não consegue mais identificar onde é o começo ou fim da informação.

XML Correto

<elemento atributo='Stacem'>Formula matemática do item</elemento>

XML corrompido

<elemento atributo='St'acem'>Valor de X > que valor de Y.</elemento>

Para resolver esse problema, devesse utilizar em campos de informações (valores dos elementos ou atributos) um “encode” para esses caracteres.

Encode XML

Basicamente são 5 valores:

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

No Framework.NET existem alguns caminhos de aplicar o encode XML:

1. string.Replace()
A maneira mais feia, mas que funciona, seria utilizar o famoso string.Replace().
Repetindo a rotina 5 vezes, uma para cada caracter especial.

string text = "Este é um \"\" XML com caracteres 'especiais' & <> diferente de tudo!!";
string encodedXml = text.Replace("&", "&amp;").Replace("< ", "&lt;").Replace(">", "&gt;").Replace("\"", "&quot;").Replace("'", "&apos;");
// RESULT: Este é um &quot;nó&quot; XML com caracteres &apos;especiais&apos; &amp; &lt;&gt; diferente de tudo!!

2. System.Web.HttpUtility.HtmlEncode()
É utilizado para codificar textos em HTML, muito utilizado em ASP.NET, porem ele não codifica o apóstrofo e força você utilizar uma referência de pacote Web. Se for uma aplicação desktop, não recomendo sua utilização.

string text = "Este é um \"\" XML com caracteres 'especiais' & <> diferente de tudo!!";
string encodedXml = HttpUtility.HtmlEncode(text);
// RESULT: Este é um &quot;nó&quot; XML com caracteres 'especiais' &amp; &lt;&gt; diferente de tudo!!

3. System.Security.SecurityElement.Escape()
Outra maneiroa é utilizar o comando Escape() que trata os 5 caracteres especiais.

string text = "Este é um \"\" XML com caracteres 'especiais' & <> diferente de tudo!!";
string encodedXml = System.Security.SecurityElement.Escape(text);
// RESULT: Este é um &quot;nó&quot; XML com caracteres &apos;especiais&apos; &amp; &lt;&gt; diferente de tudo!!

Gosto muito da opção de codificar com System.Security.SecurityElement.Escape(), acredito que seja a forma mais estética com relação ao código.
Não sei quanto a desempenho das formas, mas manipulação de string não é a melhor das escolhas.
E a segunda alem de não abranger todos os caracteres especiais, ainda fica limitada a aplicações web.

Espero ter ajudado :-)

Be Sociable, Share!

Deixe um comentario


OBS - Você pode usar estes atributos HTML e tags para formatar seus comentário:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">