Chaîne échapper à XML

Existe-t-il une fonction C # qui pourrait être utilisée pour échapper et déséchapper une chaîne, qui pourrait être utilisée pour remplir le contenu d’un élément XML?

J’utilise VSTS 2008 + C # + .Net 3.0.

EDIT 1: Je suis en train de concaténer un fichier XML simple et court et je n’utilise pas de sérialisation, donc j’ai besoin d’échapper explicitement au caractère XML manuellement, par exemple, je dois mettre a<b dans , donc je besoin d’ a<b chaîne d’échappement a<b et de le mettre dans l’élément foo.

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

SecurityElement.Escape (chaîne s)

EDIT: Vous dites “Je concatène un fichier XML simple et court et je n’utilise pas de sérialisation, donc je dois échapper explicitement les caractères XML à la main”.

Je vous conseille vivement de ne pas le faire à la main. Utilisez les API XML pour tout faire pour vous – lisez les fichiers d’origine, fusionnez les deux en un seul document (vous souhaitez probablement utiliser XmlDocument.ImportNode ), puis XmlDocument.ImportNode . Vous ne voulez pas écrire vos propres parsingurs / formateurs XML. La sérialisation est quelque peu hors de propos ici.

Si vous pouvez nous donner un exemple court mais complet de ce que vous essayez de faire, nous pouvons probablement vous aider à éviter de vous inquiéter de vous échapper.


Réponse originale

Ce que vous voulez dire n’est pas tout à fait clair, mais normalement, les API XML le font pour vous. Vous définissez le texte dans un nœud et il échappera automatiquement à tout ce dont il a besoin. Par exemple:

LINQ to XML exemple:

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

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

Sortie des deux exemples:

 Brackets & stuff <> 

Cela suppose bien sûr que vous souhaitiez que XML s’échappe. Si vous ne l’êtes pas, veuillez poster plus de détails.

Merci à @sehe pour l’évasion d’une ligne:

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

J’ajoute à cela le un-évasion d’une ligne:

 var unescapedAgain = System.Xml.XmlReader.Create(new SsortingngReader("" + escaped + "")).ReadElementSsortingng(); 

George, c’est simple. Utilisez toujours les API XML pour gérer le XML. Ils font tout pour vous échapper et vous échapper.

Ne créez jamais de code XML en ajoutant des chaînes.

Et si vous voulez, comme moi quand j’ai trouvé cette question, échapper aux noms de nœuds XML, comme par exemple lors de la lecture d’une sérialisation XML, utilisez la méthode la plus simple:

 XmlConvert.EncodeName(ssortingng nameToEscape) 

Il échappera également aux espaces et à tous les caractères non valides pour les éléments XML.

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

AVERTISSEMENT: Nécromancie

La réponse de Darin Dimitrov + System.Security.SecurityElement.Escape (ssortingng s) n’est toujours pas complète.

Dans XML 1.1, le moyen le plus simple et le plus sûr est de simplement encoder TOUT.
Aime pour \ t.
Il n’est pas du tout pris en charge dans XML 1.0.
Pour XML 1.0, une solution de contournement possible consiste à coder en base 64 le texte contenant le ou les caractères.

 //ssortingng EncodedXml = SpecialXmlEscape("привет мир"); //Console.WriteLine(EncodedXml); //ssortingng DecodedXml = XmlUnescape(EncodedXml); //Console.WriteLine(DecodedXml); public static ssortingng SpecialXmlEscape(ssortingng input) { //ssortingng content = System.Xml.XmlConvert.EncodeName("\t"); //ssortingng content = System.Security.SecurityElement.Escape("\t"); //ssortingng strDelimiter = System.Web.HttpUtility.HtmlEncode("\t"); // XmlEscape("\t"); //XmlDecode("	"); //strDelimiter = XmlUnescape(";"); //Console.WriteLine(strDelimiter); //Console.WriteLine(ssortingng.Format("&#{0};", (int)';')); //Console.WriteLine(System.Text.Encoding.ASCII.HeaderName); //Console.WriteLine(System.Text.Encoding.UTF8.HeaderName); ssortingng strXmlText = ""; if (ssortingng.IsNullOrEmpty(input)) return input; System.Text.SsortingngBuilder sb = new SsortingngBuilder(); 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 ssortingng Base64Encode(ssortingng plainText) { var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); return System.Convert.ToBase64Ssortingng(plainTextBytes); } public static ssortingng Base64Decode(ssortingng base64EncodedData) { var base64EncodedBytes = System.Convert.FromBase64Ssortingng(base64EncodedData); return System.Text.Encoding.UTF8.GetSsortingng(base64EncodedBytes); } 

Les fonctions suivantes feront le travail. N’a pas testé avec XmlDocument, mais je suppose que c’est beaucoup plus rapide.

 public static ssortingng XmlEncode(ssortingng value) { System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings { ConformanceLevel = System.Xml.ConformanceLevel.Fragment }; SsortingngBuilder builder = new SsortingngBuilder(); using (var writer = System.Xml.XmlWriter.Create(builder, settings)) { writer.WriteSsortingng(value); } return builder.ToSsortingng(); } public static ssortingng XmlDecode(ssortingng xmlEncodedValue) { System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings { ConformanceLevel = System.Xml.ConformanceLevel.Fragment }; using (var ssortingngReader = new System.IO.SsortingngReader(xmlEncodedValue)) { using (var xmlReader = System.Xml.XmlReader.Create(ssortingngReader, settings)) { xmlReader.Read(); return xmlReader.Value; } } } 

Utiliser une bibliothèque tierce ( Newtonsoft.Json ) comme alternative:

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

Exemple:

a <==> "a<b"

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