L'étape "La première ligne assigne une valeur" non divulguée est le coupable. En fonction de ce qui est utilisé, la valeur attribuée sera codée en double.
// .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();
Sortie:
// 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
Lorsque vous attribuez à .InnerText, obtenir avec .InnerXml, puis HTMLDecode, vous obtenez en effet de ce que vous attribué - chaîne encodée et HTMLDecode semble cassé. En fait, vous approchez est cassé. Vous HTML encoder deux fois (une fois à la main, puis, de façon transparente à travers setter à l'intérieur .InnerText) mais décoder qu'une seule fois.
Si votre objectif est d'obtenir "même valeur que vous mettez dans" utiliser les mêmes méthodes: 1. soit HTMLEncode + .InnerXml Setter, .InnerXml getter + HTMLDecode, ou 2. Passer le HTMLEncode/Décodage. Il suffit d'utiliser .InnerText setter, puis getter. .InnerText encode uniquement ce dont il a besoin pour ne pas casser le code 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
Cela semble très étrange. En tant que conseil de débogage, comparez 'preResult' avec la valeur attendue (' <b> ... ') entre vos deux lignes dans une fenêtre de débogage. Si cela ne vous aide pas, comparez-le octet par octet. – Heinzi
@Heinzi: Je n'ai pas eu le temps d'enquêter plus en profondeur, alors j'ai abandonné et suis venu avec une solution beaucoup plus élégante (qui n'a rien à voir avec ce problème particulier). Mais merci pour le conseil! –