我试图在 .NET (C#) 中对字符串中的 XML 实体进行转义,但我似乎无法使其正常工作。
例如,如果我有字符串 AT&T
,它应该被翻译成 AT&T
。
一种方法是使用 HttpUtility.HtmlDecode(),但那是针对 HTML 的。
所以我有两个问题:
使用 HttpUtility.HtmlDecode() 解码 XML 实体是否安全?
如何使用 XmlReader(或类似软件)执行此操作?我尝试了以下方法,但总是返回一个空字符串:
static string ReplaceEscapes(string text) { StringReader reader = new StringReader(text); XmlReaderSettings settings = new XmlReaderSettings(); settings.ConformanceLevel = ConformanceLevel.Fragment; using (XmlReader xmlReader = XmlReader.Create(reader, settings)) { return xmlReader.ReadString(); } }
最佳答案
HTML 转义和 XML 密切相关。正如你所说, HttpUtility
有 HtmlEncode
和 HtmlDecode
方法。这些也将对 XML 进行操作,因为只有少数实体需要转义:<
, >
, \
, '
和 &
在 HTML 和 XML 中。
使用 HttpUtility
的缺点类是您需要对 System.Web
的引用dll,它还会带来许多您可能不想要的其他内容。
专门针对 XML, SecurityElement
类有一个 Escape
将进行编码的方法,但没有相应的 Unescape
方法。因此,您有几个选择:
- 使用
HttpUtility.HtmlDecode()
并引用System.Web
使用您自己的解码方法来处理特殊字符(因为只有少数 - 查看 Reflector 中
SecurityElement
的静态构造函数以查看完整列表)使用(hacky)解决方案,例如:
.
public static string Unescape(string text)
{
XmlDocument doc = new XmlDocument();
string xml = string.Format("<dummy>{0}</dummy>", text);
doc.LoadXml(xml);
return doc.DocumentElement.InnerText;
}
就我个人而言,我会使用 HttpUtility.HtmlDecode()
如果我已经引用了 System.Web
,或者如果没有,我自己滚动。我不喜欢你的XmlReader
按原样处理Disposable
,这通常表示它正在使用需要释放的资源,因此可能是一项代价高昂的操作。
关于.net - 在 .NET 中使用 XmlReader 转义 XML 实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5304311/