如何使 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]"[/quote] [apo]'[/apo] [smaller]<[/smaller] [bigger]>[/bigger] [and]&[/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]<[/smaller] [bigger]>[/bigger] [and]&[/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;quot;
序列化程序,然后将其转换为&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)
方法来转义一个字符串,这将导致这里的双重转义。
可悲的是,甚至做了
" -> "
' -> '
转变你的自我,通过
Title = text.Replace("\"", """).Replace("'", "'")
导致双引号...但至少据我所知,这些是唯一不会在 XML 节点之间自动转义的,因为它们在那时是有效的。 所以我认为这不可能是您的客户想要的方式。至少不是标准化的序列化程序。对不起
【讨论】:
我尝试使用 SecurfityElement.Escape 方法:“report.Title = SecurityElement.Escape(report.Title);”我尝试过使用 SecuritElement.Escape()。”但是,这使编码器感到困惑并给出以下内容:“[quote]"[/quote] [apo]'[/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 程序集?