Вывод строки в XML
Есть ли какая-либо функция С#, которая может использоваться для удаления и удаления строки, которая может использоваться для заполнения содержимого XML-элемента?
Я использую VSTS 2008 + С# +.Net 3.0.
EDIT 1: Я соединяю простой и короткий XML файл, и я не использую сериализацию, поэтому мне нужно явно избежать символа XML вручную, например, мне нужно поместить a<b
в <foo></foo>
, поэтому мне нужно escape string a<b
и поместите его в элемент foo.
Ответы
Ответ 1
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;
}
Ответ 2
SecurityElement.Escape(строка s)
Ответ 3
EDIT: вы говорите: "Я конкатенирую простой и короткий XML файл, и я не использую сериализацию, поэтому мне нужно явно избегать символа XML вручную".
Я бы настоятельно советовал вам не делать это вручную. Используйте XML API, чтобы сделать все это для вас - прочитайте в исходных файлах, объедините их в один документ, но вам нужно (вы, вероятно, захотите использовать XmlDocument.ImportNode
), а затем запишите его снова. Вы не хотите писать свои собственные синтаксические анализаторы XML/форматировщики. Сериализация здесь несколько неактуальна.
Если вы можете дать нам короткий, но полный пример того, что вы пытаетесь сделать, мы, вероятно, можем помочь вам избежать необходимости беспокоиться о побеге в первую очередь.
Оригинальный ответ
Не совсем понятно, что вы имеете в виду, но обычно XML API делают это за вас. Вы устанавливаете текст в node, и он автоматически избегает всего, что ему нужно. Например:
Пример 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-экранирование, конечно. Если вы этого не сделаете, напишите более подробную информацию.
Ответ 4
Благодаря @sehe для однострочного escape-кода:
var escaped = new System.Xml.Linq.XText(unescaped).ToString();
Я добавляю к нему однострочный un-escape:
var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("<r>" + escaped + "</r>")).ReadElementString();
Ответ 5
Джордж, это просто. Всегда используйте XML API для обработки XML. Они делают все возможное и ускоряющее для вас.
Никогда не создавайте XML, добавляя строки.
Ответ 6
И если вы хотите, как и я, когда я нашел этот вопрос, избегать имен XML node, например, при чтении из сериализации XML, используйте самый простой способ:
XmlConvert.EncodeName(string nameToEscape)
Он также избежит пробелов и любых недопустимых символов для элементов XML.
http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx
Ответ 7
ПРЕДУПРЕЖДЕНИЕ: Некроминанты
Тем не менее Дарин Димитров отвечает + System.Security.SecurityElement.Escape(строка s) не является полным.
В XML 1.1 самый простой и безопасный способ - просто кодировать ВСЕ.
Как 	
для \t.
Он вообще не поддерживается в 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);
}
Ответ 8
Следующие функции будут выполнять эту работу. Не тестировал 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;
}
}
}
Ответ 9
Использование сторонней библиотеки (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>"
Ответ 10
Еще один ответ, основанный на ответе Джона Скита, не возвращает теги:
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"