这种情况让我发疯了!!:以下片段不起作用(我应该这样做)
...
string preResult = doc.DocumentNode.SelectSingleNode("//textarea[@name='utrans']").InnerText
return HttpUtility.HtmlDecode(preResult);
...
第一行将值(例如)"<b> Dummy value: </ b>
分配给preResult(这是预期的)。
但是下一行给了AGAIN相同的值!!!但它应该返回“&lt; b&gt; Dummy value:&lt; / b&gt;”。
调试这些行我想把这个值直接复制并粘贴到HttpUtility.HtmlDecode()中并猜猜它是什么工作!!!我得到了预期的价值!
当然这没用,但它证明了一些奇怪的事情......什么?!!
有没有人再遇到同样的情况? (dev.env.VS2008,.NET3.5SP1)
答案 0 :(得分:1)
未披露的“第一行分配价值”一步是这里的罪魁祸首。根据使用的内容,分配的值将被双重编码。
// .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编码两次(一次是手动,然后透明地通过.InnerText中的setter),但只解码一次。
如果您的目标是获得“相同的价值”,请使用相同的方法: 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
答案 1 :(得分:0)
如果值作为<b> Dummy value: </ b>
存储在XML文件中,那么获取InnerText将自动对文本进行Html解码。没有必要调用HtmlDecode。
答案 2 :(得分:0)
使用InnerHtml
代替InnerText
。
这对我有用:
aDiv.InnerHtml = HttpUtility.HtmlDecode(aString);
我用它来在网页上显示格式化文本。