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 & 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。 他们做所有的逃避和为你消除。
切勿通过附加string来创buildXML。
警告:Necromancing
仍Darin Dimitrov的答案+ System.Security.SecurityElement.Escape(strings)不完整。
在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); }
以下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