Не раскрытый шаг «Первая строка присваивает значение» является виновником здесь. В зависимости от того, что используется, назначенное значение будет кодироваться дважды.
// .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