ここでは、非公開の「最初の行が値を割り当てる」ステップが原因です。使用内容に応じて、割り当てられた値は二重にエンコードされます。
// .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エンコードを2回(1回は手動で、次に.InnerText内のsetterを介して透過的に)行いますが、デコードは1回だけです。
「入力したのと同じ値」を取得することが目標の場合は、同じ方法を使用します。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