未公开的“第一行赋值”步骤是这里的罪魁祸首。根据使用的内容,分配的值将被双重编码。
// .Dump() is a helper "display" method in LinqPad .Net snippet compiler.
// Replace with Console.Write(
var na = GetCreateXmlNode("a");
na.InnerText = "<b> Dummy value: </ b>";
na.InnerXml.Dump();
System.Web.HttpUtility.HtmlDecode(na.InnerXml).Dump();
na.InnerText.Dump();
System.Web.HttpUtility.HtmlDecode(na.InnerText).Dump(); // <- Must double-Decode
na.InnerXml = "<b> Dummy value: </ b>";
na.InnerXml.Dump();
System.Web.HttpUtility.HtmlDecode(na.InnerXml).Dump(); // <- or this if you want appearance of "parity"
na.InnerText.Dump(); // <- just use this
System.Web.HttpUtility.HtmlDecode(na.InnerText).Dump();
输出:
// Results of assigning pre-encoded string to .InnerText
&lt;b&gt; Dummy value: &lt;/ b&gt; // raw xml contents
<b> Dummy value: </ b> // double-encoding, single-decoding
<b> Dummy value: </ b> // double-encoding, single-decoding
<b> Dummy value: </ b> // double-encoding, double-decoding
// Results of assigning pre-encoded string to .InnerXml
<b> Dummy value: </ b> // raw xml contents
<b> Dummy value: </ b> // single-encoding, single-decoding, but too messy.
<b> Dummy value: </ b> // single-encoding, single-decoding
<b> Dummy value: </ b> // single-encoding, double-decoding
当您使用 .InnerText 分配时,使用 .InnerXml 获取,然后是 HTMLDecode,您确实会得到您分配的内容 - 编码字符串和 HTMLDecode 似乎已损坏。事实上,你的方法是坏的。您的 HTML 编码两次(手动一次,然后通过 .InnerText 内的设置器透明地进行)但只解码一次。
如果您的目标是获得“您输入的相同值”,请使用相同的方法:1. HTMLEncode + .InnerXml Setter、.InnerXml getter + HTMLDecode,或 2. 跳过 HTMLEncode/Decode。只需使用 .InnerText setter,然后使用 getter。
.InnerText 仅对不需要破坏 XML 的内容进行编码。
na.InnerText = "<b> Dummy value: </ b>";
na.InnerXml.Dump();
System.Web.HttpUtility.HtmlDecode(na.InnerXml).Dump();
na.InnerText.Dump(); // <- Just use that to get Decoded string.
System.Web.HttpUtility.HtmlDecode(na.InnerText).Dump();
<b> Dummy value: </ b> // raw xml contents
<b> Dummy value: </ b> // single-encoding, single-decoding, but too messy.
<b> Dummy value: </ b> // single-encoding, single-decoding
<b> Dummy value: </ b> // single-encoding, double-decoding