Feed Burner изменил свои результаты службы блогов, что возвращает блоки javascript, подобные:
document.write ( "\ x3cdiv
класс \ x3d \ x22feedburnerFeedBlock \ x22
идентификатор \ x3d \ x22RitterInsuranceMarketingRSSv3iugf6igask14fl8ok645b6l0 \ x22 \ x3e ");
document.write ( "\ x3cul \ x3e");
document.write ( "\ x3cli \ x3e \ x3cspan
класс \ x3d \ x22headline \ x22 \ x3e \ x3ca
HREF \ x3d \ x22
Я хочу использовать необработанный html. Ранее я мог легко использовать .Replace для очистки синтаксиса document.write, но я не могу понять, что это за кодировка, или хотя бы как ее декодировать с помощью C #.
Редактировать: Ну, наконец, это был полумрачный кошмар, вот что я придумал, если у кого-нибудь есть какие-либо улучшения, чтобы предложить
public static char ConvertHexToASCII(this string hex)
{
if (hex == null) throw new ArgumentNullException(hex);
return (char)Convert.ToByte(hex, 16);
}
.
private string DecodeFeedburnerHtml(string html)
{
var builder = new StringBuilder(html.Length);
var stack = new Stack<char>(4);
foreach (var chr in html)
{
switch (chr)
{
case '\\':
if (stack.Count == 0)
{
stack.Push(chr);
}
else
{
stack.Clear();
builder.Append(chr);
}
break;
case 'x':
if (stack.Count == 1)
{
stack.Push(chr);
}
else
{
stack.Clear();
builder.Append(chr);
}
break;
default:
if (stack.Count >= 2)
{
stack.Push(chr);
if (stack.Count == 4)
{
//get stack[3]stack[4]
string hexString = string.Format("{1}{0}", stack.Pop(),
stack.Pop());
builder.Append(hexString.ConvertHexToASCII());
stack.Clear();
}
}
else
{
builder.Append(chr);
}
break;
}
}
html = builder.ToString();
return html;
}
Не уверен, что еще я мог бы сделать лучше. По какой-то причине такой код всегда кажется мне очень грязным, хотя это алгоритм с линейным временем, и я думаю, это связано с тем, как долго это должно быть.