为通用Windows平台应用程序编码XML中的特殊字符

本文关键字:XML 特殊字符 编码 应用程序 Windows 平台 | 更新日期: 2023-09-27 18:02:15

推荐的System.Security.SecureElement.Escape()方法似乎不适用于通用Windows平台应用程序。

将字符串(例如Wet Paint & Co)转换为xml安全形式(Wet Paint & Co)的推荐方法是什么?

为通用Windows平台应用程序编码XML中的特殊字符

如果您查看MSDN中的备注,您可以找到一个包含所有字符的表,这些字符将从SecurityElement.Escape中转义。最简单的方法是在您自己的方法中替换这些字符:

public static string Escape(string str){
    return str.Replace("&", "&")
              .Replace(">", ">")
              .Replace("'"", """)
              .Replace("''", "'")
              .Replace("<", "&lt;");
}

但是这是相当慢的,因为每个Replace将创建一个新的字符串实例。对于大字符串,最好是遍历字符串并将字符添加到StringBuilder中。

public static string Escape(string str)
{
    var sb = new StringBuilder();
    foreach (var chr in str)
    {
        switch (chr)
        {
            case '&':
                sb.Append("&amp;");
                break;
            case '<':
                sb.Append("&lt;");
                break;
            case '>':
                sb.Append("&gt;");
                break;
            case '"':
                sb.Append("&quot;");
                break;
            case '''':
                sb.Append("&apos;");
                break;
            default:
                sb.Append(chr);
                break;
        }
    }
    return sb.ToString();
}

然而,我读到你用StringBuilder构建你的XML,所以你可以修改我的Replace方法并将你的StringBuilder传递给它。因此不需要创建第二个实例。

但是在大多数情况下,没有必要自己编码字符串,因为像XElement等类会为你做。正如其他人在你的问题的评论中所说,我认为也更容易使用LinQ to XML (XElement,…)或XML序列化来生成XML。

只是为了完整