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:
| < | < |
| > | > |
| " | " |
| ' | ' |
| & | & |
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 \"nó\" XML com caracteres 'especiais' & <> diferente de tudo!!"; string encodedXml = text.Replace("&", "&").Replace("< ", "<").Replace(">", ">").Replace("\"", """).Replace("'", "'"); // RESULT: Este é um "nó" XML com caracteres 'especiais' & <> 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 \"nó\" XML com caracteres 'especiais' & <> diferente de tudo!!"; string encodedXml = HttpUtility.HtmlEncode(text); // RESULT: Este é um "nó" XML com caracteres 'especiais' & <> diferente de tudo!!
3. System.Security.SecurityElement.Escape()
Outra maneiroa é utilizar o comando Escape() que trata os 5 caracteres especiais.
string text = "Este é um \"nó\" XML com caracteres 'especiais' & <> diferente de tudo!!"; string encodedXml = System.Security.SecurityElement.Escape(text); // RESULT: Este é um "nó" XML com caracteres 'especiais' & <> 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
