string转义成XML

是否有任何C#函数可用于转义和不转义string,可用于填充XML元素的内容?

我正在使用VSTS 2008 + C#+ .Net 3.0。

编辑1:我连接简单和短的XML文件,我不使用序列化,所以我需要显式地手动转义XML字符,例如,我需要把a<b <foo></foo> ,所以我需要转义stringa<b并将其放入元素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(strings)

编辑:你说:“我连接简单和短的XML文件,我不使用序列化,所以我需要明确地转义XML字符”。

强烈build议你不要手动做。 使用XML API为您完成所有工作 – 读入原始文件,然后将两者合并成单个文档,但是您需要(可能需要使用XmlDocument.ImportNode ),然后再写出来。 你不想编写你自己的XMLparsing器/格式器。 序列化在这里有点不相关。

如果你能给我们一个简短而完整的例子,说明你正在努力做什么,那么我们可以帮你避免担心逃跑。


原始答案

这并不完全清楚您的意思,但通常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 &amp; stuff &lt;&gt;</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。 他们做所有的逃避和为你消除。

切勿通过附加string来创buildXML。

警告:Necromancing

仍Darin Dimitrov的答案+ System.Security.SecurityElement.Escape(strings)不完整。

在XML 1.1中,最简单和最安全的方法就是编码一切。
&#09; 为\ 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("&#09;"); //strDelimiter = XmlUnescape("&#59;"); //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); } 

以下function将完成这项工作。 没有testingXmlDocument,但我想这是更快。

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

如果你想和我一样,当我发现这个问题,转义XML节点名称,例如从XML序列化读取时,使用最简单的方法:

 XmlConvert.EncodeName(string nameToEscape) 

它也将转义空格和XML元素的任何无效字符。

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