Phi*_*ert 10 .net xml entities translate
我试图在.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();
}
}
Run Code Online (Sandbox Code Playgroud)adr*_*nks 14
HTML转义和XML密切相关.正如你所说,HttpUtility既有HtmlEncode和HtmlDecode方法.这些也将在XML操作,因为有需要逃避只有少数实体:<,>,\,'和&在HTML和XML.
使用HttpUtility该类的缺点是你需要一个System.Webdll 的引用,这也带来了许多你可能不想要的东西.
特别是对于XML,SecurityElement该类有一个Escape方法可以进行编码,但没有相应的Unescape方法.因此,您有几个选择:
HttpUtility.HtmlDecode()和提出参考System.Web滚动你自己的解码方法来处理特殊字符(因为只有少数 - 看看SecurityElementReflector 中的静态构造函数来查看完整列表)
使用(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;
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我会使用,HttpUtility.HtmlDecode()如果我已经有一个参考System.Web,或者如果没有我自己.我不喜欢你的XmlReader方法Disposable,这通常表明它正在使用需要处理的资源,因此可能是一项代价高昂的操作.
你的#2解决方案可以工作,但你需要先调用xmlReader.Read();(或xmlReader.MoveToContent();)ReadString.
我认为#1也是可以接受的,即使有一些边缘情况,例如®哪个是有效的HTML实体,但不是XML实体 - 你的unescaper应该怎么做呢?将异常作为正确的XML解析器抛出,或者只是像HTML解析器那样返回"®"?
| 归档时间: |
|
| 查看次数: |
11223 次 |
| 最近记录: |