Cadena de escape en XML

¿Hay alguna función de C # que pueda usarse para escapar y liberar una cadena, que podría usarse para completar el contenido de un elemento XML?

Estoy usando VSTS 2008 + C # + .Net 3.0.

EDIT 1: estoy concatenando archivos XML simples y cortos y no uso la serialización, así que necesito escapar explícitamente del carácter XML a mano, por ejemplo, necesito poner a<b en , así que necesita escapar la cuerda a<b y ponerla en el elemento foo.

 public static string XmlEscape(string unescaped) { XmlDocument doc = new XmlDocument(); XmlNode node = doc.CreateElement("root"); node.InnerText = unescaped; return node.InnerXml; } public static string XmlUnescape(string escaped) { XmlDocument doc = new XmlDocument(); XmlNode node = doc.CreateElement("root"); node.InnerXml = escaped; return node.InnerText; } 

SecurityElement.Escape (cadena s)

EDITAR: Usted dice “estoy concatenando archivos XML simples y cortos y no uso la serialización, por lo que necesito escapar explícitamente del carácter XML a mano”.

Recomiendo encarecidamente que no lo hagas a mano. Use las API XML para hacerlo todo por usted: lea los archivos originales, combine los dos en un solo documento como lo necesite (probablemente desee usar XmlDocument.ImportNode ) y luego vuelva a escribirlo. No desea escribir sus propios analizadores / formateadores XML. La serialización es algo irrelevante aquí.

Si puede darnos un ejemplo breve pero completo de lo que está tratando de hacer, probablemente podamos ayudarlo a evitar tener que preocuparse de escapar en primer lugar.


Respuesta original

No está del todo claro qué quiere decir, pero normalmente las API de XML hacen esto por usted. Establece el texto en un nodo y escapará automáticamente a todo lo que necesite. Por ejemplo:

Ejemplo LINQ to XML:

 using System; using System.Xml.Linq; class Test { static void Main() { XElement element = new XElement("tag", "Brackets & stuff <>"); Console.WriteLine(element); } } 

DOM ejemplo:

 using System; using System.Xml; class Test { static void Main() { XmlDocument doc = new XmlDocument(); XmlElement element = doc.CreateElement("tag"); element.InnerText = "Brackets & stuff <>"; Console.WriteLine(element.OuterXml); } } 

Salida de ambos ejemplos:

 Brackets & stuff <> 

Eso supone que quieres XML escapando, por supuesto. Si no es así, publique más detalles.

Gracias a @sehe por el escape de una línea:

 var escaped = new System.Xml.Linq.XText(unescaped).ToString(); 

Le agrego el escape de una línea:

 var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("" + escaped + "")).ReadElementString(); 

George, es simple. Utilice siempre las API XML para manejar XML. Hacen todo lo posible para escapar y escaparse.

Nunca cree XML agregando cadenas.

Y si desea, como yo cuando encontré esta pregunta, escapar de los nombres de nodo XML, como por ejemplo al leer una serialización XML, use la forma más fácil:

 XmlConvert.EncodeName(string nameToEscape) 

También escapará espacios y cualquier carácter no válido para elementos XML.

http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx

ADVERTENCIA: Nigromancia

Aún la respuesta de Darin Dimitrov + System.Security.SecurityElement.Escape (string s) no está completa.

En XML 1.1, la forma más simple y segura es simplemente codificar TODO.
Me gusta para \ t.
No es compatible en absoluto en XML 1.0.
Para XML 1.0, una solución posible es codificar en base-64 el texto que contiene los caracteres.

 //string EncodedXml = SpecialXmlEscape("привет мир"); //Console.WriteLine(EncodedXml); //string DecodedXml = XmlUnescape(EncodedXml); //Console.WriteLine(DecodedXml); public static string SpecialXmlEscape(string input) { //string content = System.Xml.XmlConvert.EncodeName("\t"); //string content = System.Security.SecurityElement.Escape("\t"); //string strDelimiter = System.Web.HttpUtility.HtmlEncode("\t"); // XmlEscape("\t"); //XmlDecode("	"); //strDelimiter = XmlUnescape(";"); //Console.WriteLine(strDelimiter); //Console.WriteLine(string.Format("&#{0};", (int)';')); //Console.WriteLine(System.Text.Encoding.ASCII.HeaderName); //Console.WriteLine(System.Text.Encoding.UTF8.HeaderName); string strXmlText = ""; if (string.IsNullOrEmpty(input)) return input; System.Text.StringBuilder sb = new StringBuilder(); for (int i = 0; i < input.Length; ++i) { sb.AppendFormat("&#{0};", (int)input[i]); } strXmlText = sb.ToString(); sb.Clear(); sb = null; return strXmlText; } // End Function SpecialXmlEscape 

XML 1.0:

 public static string Base64Encode(string plainText) { var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); return System.Convert.ToBase64String(plainTextBytes); } public static string Base64Decode(string base64EncodedData) { var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); } 

Las siguientes funciones harán el trabajo. No probé contra XmlDocument, pero supongo que esto es mucho más rápido.

 public static string XmlEncode(string value) { System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings { ConformanceLevel = System.Xml.ConformanceLevel.Fragment }; StringBuilder builder = new StringBuilder(); using (var writer = System.Xml.XmlWriter.Create(builder, settings)) { writer.WriteString(value); } return builder.ToString(); } public static string XmlDecode(string xmlEncodedValue) { System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings { ConformanceLevel = System.Xml.ConformanceLevel.Fragment }; using (var stringReader = new System.IO.StringReader(xmlEncodedValue)) { using (var xmlReader = System.Xml.XmlReader.Create(stringReader, settings)) { xmlReader.Read(); return xmlReader.Value; } } } 

Usar una biblioteca de terceros ( Newtonsoft.Json ) como alternativa:

 public static string XmlEncode(string unescaped) { if (unescaped == null) return null; return JsonConvert.SerializeObject(unescaped); ; } public static string XmlDecode(string escaped) { if (escaped == null) return null; return JsonConvert.DeserializeObject(escaped, typeof(string)).ToString(); } 

Ejemplo:

a <==> "a<b"

<==> "foo></foo>"