Dan*_*olt 120
SecurityElement.Escape(string s)
Dar*_*rov 72
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;
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 37
编辑:你说"我连接简单和短的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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
两个例子的输出:
<tag>Brackets & stuff <></tag>
Run Code Online (Sandbox Code Playgroud)
当然,这是假设你想要XML转义.如果您不是,请发布更多详细信息.
Kei*_*son 24
感谢@sehe的单线逃生:
var escaped = new System.Xml.Linq.XText(unescaped).ToString();
Run Code Online (Sandbox Code Playgroud)
我添加了单行un-escape:
var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("<r>" + escaped + "</r>")).ReadElementString();
Run Code Online (Sandbox Code Playgroud)
如果你想,像我发现这个问题时一样,转义 XML 节点名称,例如从 XML 序列化读取时,使用最简单的方法:
XmlConvert.EncodeName(string nameToEscape)
Run Code Online (Sandbox Code Playgroud)
它还将为 XML 元素转义空格和任何无效字符。
http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx
另一种基于 John Skeet 的答案的方法,该答案不返回标签:
void Main()
{
XmlString("Brackets & stuff <> and \"quotes\"").Dump();
}
public string XmlString(string text)
{
return new XElement("t", text).LastNode.ToString();
}
Run Code Online (Sandbox Code Playgroud)
这仅以 XML 编码格式返回传入的值:
Brackets & stuff <> and "quotes"
Run Code Online (Sandbox Code Playgroud)
警告:死灵法术
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
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
93289 次 |
| 最近记录: |