1

この状況は私を夢中にさせています!!: 次のスニペットは機能しません (私のように)

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

最初の行は値 (例) "<b> Dummy value: </ b> を preResult に代入します (これは予想通りです)。

しかし、次の行は再び同じ値を与えます!!! ただし、「<b> ダミー値: </ b>」を返す必要があります。

これらの行をデバッグして、値を直接コピーして HttpUtility.HtmlDecode() に貼り付け、何が機能したかを推測することを考えました!!! 期待値出た!

もちろん、これは役に立ちませんが、何か奇妙なことが起こっていることを証明しています...何ですか?!!

誰かが再び同じ状況に直面しましたか? (dev.env.VS2008、.NET3.5SP1)

4

3 に答える 3

1

ここでは、非公開の「最初の行が値を割り当てる」ステップが原因です。使用内容に応じて、割り当てられた値は二重にエンコードされます。

// .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();

出力:

// 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

.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();

&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
于 2011-11-10T13:18:42.750 に答える
0

値がXMLファイルに保存されている場合&lt;b&gt; Dummy value: &lt;/ b&gt; 、InnerTextを取得すると、テキストが自動的にHtmlDecodeされます。HtmlDecodeを呼び出す必要はありません。

于 2010-05-20T14:17:12.027 に答える
0

InnerHtmlの代わりに使用してくださいInnerText

これは私のために働いた:

aDiv.InnerHtml = HttpUtility.HtmlDecode(aString);

これを使用して、フォーマットされたテキストをWebページに表示しています。

于 2010-10-18T14:54:50.850 に答える