是否有任何C#函数可用于转义和取消转义字符串,可用于填充XML元素的内容?
我正在使用VSTS 2008 + C#+ .Net 3.0。
编辑1:我是串联简单和短期的XML文件,我不使用序列化,所以我需要手动明确转义XML字符,例如,我需要把a<b
成<foo></foo>
,所以我需要逃避串a<b
并付诸元素富。
是否有任何C#函数可用于转义和取消转义字符串,可用于填充XML元素的内容?
我正在使用VSTS 2008 + C#+ .Net 3.0。
编辑1:我是串联简单和短期的XML文件,我不使用序列化,所以我需要手动明确转义XML字符,例如,我需要把a<b
成<foo></foo>
,所以我需要逃避串a<b
并付诸元素富。
new XText(unescaped).ToString()
Answers:
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
从System.Web
可以安全地使用?
编辑:您说“我正在串联简单而简短的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/zh-cn/library/system.security.securityelement.escape%28VS.80%29.aspx
警告:死灵法术
Darin Dimitrov的答案+ System.Security.SecurityElement.Escape(string 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);
}
以下功能将完成工作。没有针对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>"