我有一个最终保存在xml节点中的TextBox。我在保存xml之前使用 SecurityElement.Escape(string2Escape)来转义无效字符。
问题:我尝试使用IsValidText测试是否需要运行转义方法,但它返回'''和'&' as有效,但是当你保存xml系统barfs时,因为它们实际上是无效的。它似乎只在'<'上返回false或'>'。
简单的解决方案,删除检查,但我的问题是为什么会出现这种情况?
以下是我失败的代码:
private string EscapeXML(string nodeText)
{
if (!SecurityElement.IsValidText(nodeText))
{
return SecurityElement.Escape(nodeText);
}
return nodeText;
}
答案 0 :(得分:5)
这是我从Reflector得到的。
这可以解释为什么它的行为方式如此。我没有看到SecurityElement中的任何方法能够满足您的需求,但是它很简单,可以自己实现,也许作为扩展方法。
答案 1 :(得分:2)
SecurityElement构造函数显然已经在自己进行了一些转义(包括“&”字符),因此IsValidText似乎只检查构造函数尚未处理的字符。 因此,使用SecurityElement的IsValidText / Escape组合看起来并不安全,除非您使用SecurityElement构建整个xml。
我会尝试用一个例子来解释:
using System;
using System.Diagnostics;
using System.Security;
class MainClass
{
public static void Main (string[] args)
{
// the SecurityElement constructor escapes the & all by itself
var xmlRoot =
new SecurityElement("test","test &");
// the & is escaped without SecurityElement.Escape
Console.WriteLine (xmlRoot.ToString());
// this would throw an exception (the SecurityElement constructor
// apparently can't escape < or >'s
// var xmlRoot2 =
// new SecurityElement("test",@"test & > """);
// so this text needs to be escaped before construction
var xmlRoot3 =
new SecurityElement("test",EscapeXML(@"test & > """));
Console.WriteLine (xmlRoot3.ToString());
}
private static string EscapeXML(string nodeText)
{
return (SecurityElement.IsValidText(nodeText))?
nodeText :
SecurityElement.Escape(nodeText);
}
}