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 编码两次(手动一次,然后通过 .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();

&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

使用InnerHtml而不是InnerText.

这对我有用:

aDiv.InnerHtml = HttpUtility.HtmlDecode(aString);

我正在使用它在网页上显示格式化的文本。

于 2010-10-18T14:54:50.850 回答
0

如果值存储在 XML 文件中,&lt;b&gt; Dummy value: &lt;/ b&gt; 那么获取 InnerText 将自动对文本进行 HtmlDecode。无需调用 HtmlDecode。

于 2010-05-20T14:17:12.027 回答