HttpUtility.HtmlDecode сводит меня с ума - PullRequest
1 голос
/ 20 мая 2010

Эта ситуация сводит меня с ума !!: следующий фрагмент не работает (как я должен)

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

В первой строке присваивается значение (например,) "<b> Dummy value: </ b> в preResult (это ожидается).

НО следующая строка дает СНОВА аналогичное значение !!! Но он должен вернуть " Dummy value: ".

Отладка этих строк Я думал скопировать и вставить значение непосредственно в HttpUtility.HtmlDecode () и угадайте, что ... это сработало !!! Я получил ожидаемое значение!

Конечно, это бесполезно, но это доказывает, что происходит что-то странное ... что? !!

Кто-нибудь снова сталкивался с такой же ситуацией? (dev.env. VS2008, .NET3.5SP1)

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

Не раскрытый шаг «Первая строка присваивает значение» является виновником здесь. В зависимости от того, что используется, назначенное значение будет кодироваться дважды.

// .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 = "&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
0 голосов
/ 18 октября 2010

Используйте InnerHtml вместо InnerText.

Это сработало для меня:

aDiv.InnerHtml = HttpUtility.HtmlDecode(aString);

Я использую это для отображения форматированного текста на веб-странице.

0 голосов
/ 20 мая 2010

Если значения хранятся в файле XML как &lt;b&gt; Dummy value: &lt;/ b&gt;, то получение InnerText автоматически HtmlDecode текстаНет необходимости вызывать HtmlDecode.

...