.net - 在 .NET 中使用 XmlReader 转义 XML 实体?

标签 .net xml entities translate

我试图在 .NET (C#) 中对字符串中的 XML 实体进行转义,但我似乎无法使其正常工作。

例如,如果我有字符串 AT&T,它应该被翻译成 AT&T

一种方法是使用 HttpUtility.HtmlDecode(),但那是针对 HTML 的。

所以我有两个问题:

  1. 使用 HttpUtility.HtmlDecode() 解码 XML 实体是否安全?

  2. 如何使用 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方法。因此,您有几个选择:

  1. 使用HttpUtility.HtmlDecode()并引用 System.Web
  2. 使用您自己的解码方法来处理特殊字符(因为只有少数 - 查看 Reflector 中 SecurityElement 的静态构造函数以查看完整列表)

  3. 使用(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/

相关文章:

c# - .net编码通过将所有数据从一个excel工作簿复制到另一个

python - 在解析之前用 Python 清理 XML 文件

xml - 如何使用 Perl 编辑 XML 文件?

Symfony2 Doctrine :generate:entities never works

PHP DomDocument XML 加载损坏的 XML 数据

simplexml - PHP simplexml 实体

.net - 在 VB.NET 中保存数千个文件的最快方法?

c# - 如何防止在 AddingNew 事件中将项目添加到 BindingList 中?

asp.net - 系统无效操作异常: This document already has a 'DocumentElement' node

c# - 继承泛型类型和约束时的类型推断