String escape in XML

Esiste una funzione C # che potrebbe essere utilizzata per uscire e sfuggire una stringa, che potrebbe essere utilizzata per riempire il contenuto di un elemento XML?

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

EDIT 1: concatenamento di file XML semplici e brevi e non utilizzo la serializzazione, quindi ho bisogno di estrarre esplicitamente il carattere XML a mano, ad esempio, ho bisogno di inserire a<b in , quindi serve la stringa di escape a<b e la metti nell’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 (string s)

EDIT: Dici “Sto concatenando un file XML semplice e breve e non uso la serializzazione, quindi ho bisogno di estrarre esplicitamente il carattere XML a mano”.

Ti consiglio vivamente di non farlo a mano. Usa le API XML per fare tutto per te – leggi nei file originali, unisci i due in un unico documento, ma è necessario (probabilmente si desidera utilizzare XmlDocument.ImportNode ), e poi XmlDocument.ImportNode . Non vuoi scrivere i tuoi parser / formattatori XML. La serializzazione è alquanto irrilevante qui.

Se puoi darci un esempio breve ma completo di esattamente quello che stai cercando di fare, probabilmente possiamo aiutarti a evitare di dovermi preoccupare di fuggire in primo luogo.


Risposta originale

Non è del tutto chiaro cosa intendi, ma normalmente le API XML fanno questo per te. Si imposta il testo in un nodo, e si uscirà automaticamente tutto ciò di cui ha bisogno. Per esempio:

Esempio da LINQ a XML:

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

Esempio DOM:

 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); } } 

Output da entrambi gli esempi:

 Brackets & stuff <> 

Questo presuppone che tu voglia l’escape XML, ovviamente. Se non lo sei, per favore pubblica più dettagli.

Grazie a @sehe per la fuga di una riga:

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

Aggiungo ad essa la fuga unilinea:

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

George, è semplice. Utilizza sempre le API XML per gestire XML. Fanno tutto il fuggire e senza scampo per te.

Non creare mai XML aggiungendo stringhe.

E se vuoi, come me quando ho trovato questa domanda, per sfuggire ai nomi dei nodes XML, come ad esempio durante la lettura da una serializzazione XML, usa il modo più semplice:

 XmlConvert.EncodeName(string nameToEscape) 

Eviterà anche spazi e caratteri non validi per elementi XML.

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

ATTENZIONE: Negromante

La risposta di Still Darin Dimitrov + System.Security.SecurityElement.Escape (string s) non è completa.

In XML 1.1, il modo più semplice e sicuro è quello di codificare TUTTO.
Mi piace per \ t.
Non è supportato affatto in XML 1.0.
Per XML 1.0, una ansible soluzione è quella di codificare in base 64 il testo che contiene i caratteri.

 //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); } 

Le seguenti funzioni faranno il lavoro. Non ho provato contro XmlDocument, ma immagino che sia molto più veloce.

 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; } } } 

Utilizzo di una libreria di terze parti ( Newtonsoft.Json ) in 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(); } 

Esempio:

a < ==> "a<b"

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