2011-02-16 21 views
9

Tengo un TextBox que finalmente se guarda en un nodo xml. Estoy utilizando el SecurityElement.Escape (string2Escape) para escapar de los caracteres no válidos antes de guardar el xml.SecurityElement.IsValidText devuelve verdadero en "&" ... ¿por qué?

Problema: Intenté usar IsValidText para probar si necesito ejecutar el método de escape, pero devuelve '' 'y' & 'como válido pero luego cuando guardas el xml el sistema barfs porque son, de hecho, , no es válido. Parece que solo devuelve falso en '<' o '>'.

Solución simple, quite el cheque, pero mi pregunta es ¿por qué sería este el caso?

La siguiente es mi código en su defecto:

private string EscapeXML(string nodeText) 
{ 
    if (!SecurityElement.IsValidText(nodeText)) 
    { 
     return SecurityElement.Escape(nodeText); 
    } 
    return nodeText; 
} 

Respuesta

2

El constructor de SecurityElement aparentemente ya está escapando por su cuenta (incluido el carácter "&"), por lo que IsValidText parece estar únicamente buscando los caracteres que el constructor no está ya atendiendo. Como consecuencia, no parece seguro utilizar el combo IsValidText/Escape de SecurityElement, a menos que use SecurityElement para compilar el xml completo.

Voy a tratar de explicar mejor con un ejemplo:

using System; 
using System.Diagnostics; 
using System.Security; 

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     // the SecurityElement constructor escapes the & all by itself 
     var xmlRoot = 
      new SecurityElement("test","test &"); 

     // the & is escaped without SecurityElement.Escape 
     Console.WriteLine (xmlRoot.ToString()); 

     // this would throw an exception (the SecurityElement constructor 
     // apparently can't escape <or>'s 
     // var xmlRoot2 = 
     // new SecurityElement("test",@"test & > """); 

     // so this text needs to be escaped before construction 
     var xmlRoot3 = 
      new SecurityElement("test",EscapeXML(@"test & > """)); 
     Console.WriteLine (xmlRoot3.ToString()); 

    } 

    private static string EscapeXML(string nodeText) 
    { 
     return (SecurityElement.IsValidText(nodeText))? 
      nodeText : 
      SecurityElement.Escape(nodeText); 
    } 
} 
5

Esto es lo que obtuve de reflector. enter image description here enter image description here

Esto puede explicar por qué se está comportando de la forma en que se comporta. No veo ningún método en SecurityElement que haga lo que está buscando, pero es lo suficientemente simple como para implementar uno usted mismo, tal vez como un método de extensión.

Cuestiones relacionadas