2010-05-20 10 views
1

Cette situation me rend fou !!: l'extrait suivant ne fonctionne pas (comme je devrais)HttpUtility.HtmlDecode me rend fou

... 
string preResult = doc.DocumentNode.SelectSingleNode("//textarea[@name='utrans']").InnerText 
return HttpUtility.HtmlDecode(preResult); 
... 

La première ligne attribue une valeur (par exemple) "&lt;b&gt; Dummy value: &lt;/ b&gt; dans preResult (c'est attendu). MAIS la ligne suivante donne ENCORE la même valeur !!! Mais il devrait retourner "<b> Dummy value: </b >".

Débogage de ces lignes, j'ai pensé à copier et coller la valeur directement dans HttpUtility.HtmlDecode() et devinez quoi ... ça a marché !!! J'ai eu la valeur attendue!

Bien sûr, cela ne sert à rien, mais cela prouve que quelque chose d'étrange se passe ... quoi? !!

Est-ce que quelqu'un a encore fait face à la même situation? (dev.env. VS2008, .NET3.5SP1)

+0

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

+0

@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! –

Répondre

0

Si les valeurs sont stockées dans le fichier XML en tant que &lt;b&gt; Dummy value: &lt;/ b&gt;, l'insertion de InnerText entraîne automatiquement le codage Html du texte. Il n'y a pas besoin d'appeler HtmlDecode.

+0

C'est ce que je pensais non plus! Mais je suppose que nous n'avons pas raison! InnerText renvoie exactement cette chaîne et rien d'autre! –

+0

J'ai couru ceci avec ce code dans un noeud XML, l'ai récupéré en utilisant InnerText et ai fait un débogage.Écriture du texte, et il s'est montré bien formé. Essayez-vous de le mettre sur une page Web? – Robaticus

0

Utilisez InnerHtml au lieu de InnerText.

Cela a fonctionné pour moi:

aDiv.InnerHtml = HttpUtility.HtmlDecode(aString); 

J'utilise cette option pour afficher le texte formaté sur une page Web.

1

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 = "&lt;b&gt; Dummy value: &lt;/ b&gt;"; 

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 = "&lt;b&gt; Dummy value: &lt;/ b&gt;"; 

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 
&amp;lt;b&amp;gt; Dummy value: &amp;lt;/ b&amp;gt; // raw xml contents 
&lt;b&gt; Dummy value: &lt;/ b&gt; // double-encoding, single-decoding 
&lt;b&gt; Dummy value: &lt;/ b&gt; // double-encoding, single-decoding 
<b> Dummy value: </ b> // double-encoding, double-decoding 

// Results of assigning pre-encoded string to .InnerXml 
&lt;b&gt; Dummy value: &lt;/ b&gt; // 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(); 

&lt;b&gt; Dummy value: &lt;/ b&gt; // 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