如何使 System.Web XmlSerializer 序列化程序编码引号 c#

Posted

技术标签:

【中文标题】如何使 System.Web XmlSerializer 序列化程序编码引号 c#【英文标题】:How to make System.Web XmlSerializer serializer encode quotes c# 【发布时间】:2020-06-08 04:12:31 【问题描述】:

我有以下测试用例:

    [TestMethod]
    public void SimpleEncodingTest()
    
        var report = new SimpleReportTitle = @"[quote]""[/quote] [apo]'[/apo] [smaller]<[/smaller] [bigger]>[/bigger] [and]&[/and]" ;


        XmlSerializer xsSubmit = new XmlSerializer(typeof(SimpleReport));

        var xml = "";

        using (var sww = new StringWriter())
        
            using (XmlWriter writer = XmlWriter.Create(sww, new XmlWriterSettings
            
                Encoding = Encoding.Default
            ))
            
                xsSubmit.Serialize(writer, report);
                xml = sww.ToString(); // Your XML
            
        


    

我希望将包括撇号引号在内的所有特殊字符都包含在内:

    <?xml version="1.0" encoding="utf-16" ?>
    <SimpleReport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Title>[quote]&quot;[/quote] [apo]&apos;[/apo] [smaller]&lt;[/smaller] [bigger]&gt;[/bigger] [and]&amp;[/and]</Title>
    </SimpleReport>

标题为“[quote]”[/quote] [apo]'[/apo] [smaller][/bigger] [and]&[/and]”

相反,我得到:

    <?xml version="1.0" encoding="utf-16" ?>
    <SimpleReport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Title>[quote]"[/quote] [apo]'[/apo] [smaller]&lt;[/smaller] [bigger]&gt;[/bigger] [and]&amp;[/and]</Title>
    </SimpleReport>

标题是 [/quote] [apo]'[/apo] [smaller][/bigger] [and]&[/and]。

如何告诉序列化程序我也编码了引号和撇号?

PS:我知道您通常不需要对这些字符进行编码,但这是客户要求。

尝试:

尝试提供如下设置: Avoid XML Escape Double Quote 但它并没有改变结果

尝试将编码更改为 UTF-8 和其他编码,但未成功

https://www.codeproject.com/Questions/1249846/How-do-you-force-Csharp-xmlserializer-to-escape-ap

尝试使用 System.Net.WebUtility.htmlDecode(string)。但是,System.Net.WebUtility.HtmlDecode(string) 不编码引号和撇号。

尝试使用 SecurfityElement.Escape(string)。这正确地将字符串转换为&amp;amp;quot; 序列化程序,然后将其转换为&amp;amp;quot;

【问题讨论】:

您可以使用 System.Net.WebUtility.HtmlDecode(string) 和 System.Net.WebUtility.HtmlEncode(string) 来替换 HTML 特殊字符。 我试过了。 System.Net.WebUtility.HtmlDecode 不对引号进行编码。 您正在使用的查看器可能正在显示带有双引号的字符串,而这些双引号实际上不在字符串中。双引号不需要编码。见维基:en.wikipedia.org/wiki/… 我知道这一点。这是客户的要求。 【参考方案1】:

怎么样?由于它们不在属性中,因此请告诉您的客户您使用 UTF16 对它们进行了编码 - 您就是这样做的。否则你通常可以使用SecurityElement.Escape(String) 方法来转义一个字符串,这将导致这里的双重转义。 可悲的是,甚至做了

" -> &quot;
' -> &apos;

转变你的自我,通过

Title = text.Replace("\"", "&quot;").Replace("'", "&apos;")

导致双引号...但至少据我所知,这些是唯一不会在 XML 节点之间自动转义的,因为它们在那时是有效的。 所以我认为这不可能是您的客户想要的方式。至少不是标准化的序列化程序。对不起

【讨论】:

我尝试使用 SecurfityElement.Escape 方法:“report.Title = SecurityElement.Escape(report.Title);”我尝试过使用 SecuritElement.Escape()。”但是,这使编码器感到困惑并给出以下内容:“[quote]&quot;[/quote] [apo]&apos;[/apo]” 再次嗨。我看到了你的更新答案。但我的问题仍然存在。您的意思是我在 xml 序列化之前或之后应用替换功能吗?因为如果我之前执行它,序列化程序会将“”编码为“”。 你是对的。这导致双引号......我更新了我的答案 天哪,你仍然是对的 xD,我真的不知道 :( 比我认为你的客户想要的方式不可能。至少不是标准化的序列化程序。sry 好吧,谢谢您的意见。你可能是对的。但是,我认为在序列化后替换整个 xml 并不安全。它可能会产生意想不到的结果。

以上是关于如何使 System.Web XmlSerializer 序列化程序编码引号 c#的主要内容,如果未能解决你的问题,请参考以下文章

如何获得'System.Web.Http,版本 = 5.2.3.0?

如何更改 FileUpload 控件 (System.Web.UI.WebControls) 中浏览按钮的文本

如何解决错误“尝试通过安全透明方法'System.Web.Http.GlobalConfiguration.get_Configuration()

ASP.NET MVC 应用程序如何严重依赖 System.Web 程序集?

如何绕过 System.Web.Http.AuthorizeAttribute.IsAuthorized

如何将 System.Web 引用添加到 Windows 窗体应用程序