Есть ли какая-либо функция C #, которая может использоваться для экранирования и отмены экранирования строки, которая может использоваться для заполнения содержимого элемента XML?
Я использую VSTS 2008 + C # + .Net 3.0.
EDIT 1: Я конкатенации простой и короткий файл XML , и я не использую сериализации, так что мне нужно явно избежать XML характер вручную, например, мне нужно положить a<b
в <foo></foo>
, так что мне нужно бежать строку a<b
и поместить его в элемент обув.
new XText(unescaped).ToString()
Ответы:
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; }
источник
HttpUtility.HtmlEncode
fromSystem.Web
?SecurityElement.Escape (строка)
источник
РЕДАКТИРОВАТЬ: вы говорите: «Я объединяю простой и короткий XML-файл, и я не использую сериализацию, поэтому мне нужно явно вручную экранировать символ XML».
Я настоятельно не рекомендую делать это вручную. Используйте XML API, чтобы сделать все за вас - прочтите исходные файлы, объедините их в один документ, но вам это нужно (вы, вероятно, захотите использовать
XmlDocument.ImportNode
), а затем снова запишите его. Вы не хотите писать свои собственные анализаторы / средства форматирования XML. Сериализация здесь несколько неактуальна.Если вы дадите нам краткий, но полный пример того, что именно вы пытаетесь сделать, мы, вероятно, сможем помочь вам вообще не беспокоиться о побеге.
Оригинальный ответ
Не совсем понятно, что вы имеете в виду, но обычно XML API делают это за вас. Вы устанавливаете текст в узле, и он автоматически избегает всего, что ему нужно. Например:
Пример 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:
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); } }
Результат обоих примеров:
<tag>Brackets & stuff <></tag>
Это, конечно, при условии, что вы хотите экранировать XML. Если нет, опубликуйте подробности.
источник
Спасибо @sehe за однострочный переход:
var escaped = new System.Xml.Linq.XText(unescaped).ToString();
Я добавляю к нему однострочную отмену:
var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("<r>" + escaped + "</r>")).ReadElementString();
источник
Джордж, это просто. Всегда используйте XML API для обработки XML. Они все убегают за вас.
Никогда не создавайте XML, добавляя строки.
источник
XmlElementSyntax
. И это также осложняется тем, что вам///
тоже нужно сгенерировать . И я не могу генерировать каждую строку как отдельнуюXObject
, потому что это не сработает для многострочных тегов.///
перед ним, а затем переформатируйте код. Ничего особенного, и, конечно же, очень важный случай. В случае крайней необходимости, я уверен, вы могли бы создать обычай,XmlWriter
чтобы делать разрывы строк и пробелы так, как вы хотите, но помещая их///
перед новыми строками. В качестве альтернативы можно использовать XSLT для красивой печати XML. Но в любом случае XML должен по-прежнему генерироваться XML API.И если вы хотите, как и я, когда я нашел этот вопрос, избежать имен узлов XML, например, при чтении из сериализации XML, используйте самый простой способ:
XmlConvert.EncodeName(string nameToEscape)
Он также будет экранировать пробелы и любые недопустимые символы для элементов XML.
http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx
источник
Еще один вариант, основанный на ответе Джона Скита, который не возвращает теги :
void Main() { XmlString("Brackets & stuff <> and \"quotes\"").Dump(); } public string XmlString(string text) { return new XElement("t", text).LastNode.ToString(); }
Это возвращает только переданное значение в кодированном формате XML:
Brackets & stuff <> and "quotes"
источник
ВНИМАНИЕ: Некромантинг
Тем не менее ответ Дарина Димитрова + System.Security.SecurityElement.Escape (string s) не завершен.
В XML 1.1 самый простой и безопасный способ - просто закодировать ВСЕ.
Как
	
для \ т.Он вообще не поддерживается в XML 1.0.
Для XML 1.0 одним из возможных обходных путей является кодирование текста, содержащего символ (символы), в кодировке base-64.
//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); }
источник
Следующие функции сделают свою работу. Не тестировал XmlDocument, но думаю, это намного быстрее.
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; } } }
источник
Использование сторонней библиотеки ( Newtonsoft.Json ) в качестве альтернативы:
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(); }
Пример:
a<b
<==>"a<b"
<foo></foo>
<==>"foo></foo>"
источник