2010-05-06 3 views
4

Есть ли более «тонкая» альтернатива System.Web.HttpUtility.HtmlEncode/.Decode в .net 3.5 (sp1)? Отдельная библиотека в порядке или даже «хочет», по крайней мере, что-то, что не тянет «совершенно новый мир» зависимостей, которые требует System.Web.Альтернатива System.Web.HttpUtility.HtmlEncode/Decode?

Я хочу преобразовать нормальную строку в свой эквивалент xml/xhtml (& назад).

ответ

5

Для XML вы просто должны кодировать символы, которые имеют особое значение, так что вы могли бы уйти с чем-то простым, как:

public static string XmlEncode(string value) { 
    return value 
    .Replace("<", "&lt;") 
    .Replace(">", "&gt;") 
    .Replace("\"", "&quot;") 
    .Replace("'", "&apos;") 
    .Replace("&", "&amp;"); 
} 

public static string XmlDecode(string value) { 
    return value 
    .Replace("&lt;", "<") 
    .Replace("&gt;", ">") 
    .Replace("&quot;", "\"") 
    .Replace("&apos;", "'") 
    .Replace("&amp;", "&"); 
} 
+0

Мое Q на самом деле не было абсолютно ясным, но это - мое использование. Благодаря! –

+2

Этот 'XmlDecode' даже не начинает охватывать ссылки на символы и сущности XML (http://www.w3.org/TR/xml/#sec-references), безразличные разделы' CDATA' и т. Д. –

1

Если возможно вы можете «заимствовать» класс HttpUtility от Mono кода и скомпилируйте его непосредственно в свою сборку.

1

Хотя кодирование может показаться простым, я настоятельно рекомендую использовать библиотеку с широким распространением, чтобы свести к минимуму риск уязвимостей. Microsoft Anti-Cross Site Scripting Library предоставляет методы для экранирования Html/Xml/Javascript и соответствующих атрибутов и должен охватывать большинство ваших потребностей в сети.

22

Возможно, в .NET Framework 4.0, System.Net.WebUtility.HtmlEncode? Обратите внимание: этот класс находится в System.dll, а не System.Web.dll.

+0

хороший. стоит отметить, что это только в .net 4.0 или новее. – dmihailescu

4

Для HTML, при использовании .NET Framework 4.0 в System.Net.WebUtility не является жизнеспособным решением, вы могли бы использовать это:

string HtmlEncode(string s) 
{ 
    if (s == null) 
    { 
     return null; 
    } 

    var result = new StringBuilder(s.Length); 

    foreach (char ch in s) 
    { 
     if (ch <= '>') 
     { 
      switch (ch) 
      { 
       case '<': 
        result.Append("&lt;"); 
        break; 

       case '>': 
        result.Append("&gt;"); 
        break; 

       case '"': 
        result.Append("&quot;"); 
        break; 

       case '\'': 
        result.Append("&#39;"); 
        break; 

       case '&': 
        result.Append("&amp;"); 
        break; 

       default: 
        result.Append(ch); 
        break; 
      } 
     } 
     else if (ch >= 160 && ch < 256) 
     { 
      result.Append("&#").Append(((int)ch).ToString(CultureInfo.InvariantCulture)).Append(';'); 
     } 
     else 
     { 
      result.Append(ch); 
     } 
    } 

    return result.ToString(); 
} 

Резон реализации:

Doing много Replace() на струне было бы очень мало, особенно на больших струнах.

Отказ от ответственности:

Это решение было вызвано использованием JetBrains dotPeek на 4,0 системы сборки .NET Framework.

+0

+1 Не знал о System.Net.WebUtility! – BrunoSalvino

 Смежные вопросы

  • Нет связанных вопросов^_^