Недавно я начал экспериментировать с HtmlAgilityPack. Я не знаком со всеми его вариантами, и я думаю, что я делаю что-то неправильно.
У меня есть строка со следующим содержимым:
string s = "<span style=\"color: #0000FF;\"><</span>";
Вы видите, что в моем промежутке у меня есть знак «меньше». Я обрабатываю эту строку следующим кодом:
HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(s);
Но когда я делаю быстрый и грязный вид в промежутке, как это:
htmlDocument.DocumentNode.ChildNodes[0].InnerHtml
Я вижу, что пробел пуст.
Какой вариант мне нужно установить, чтобы сохранить знак «меньше». Я уже пробовал это:
htmlDocument.OptionAutoCloseOnEnd = false;
htmlDocument.OptionCheckSyntax = false;
htmlDocument.OptionFixNestedTags = false;
но без успеха.
Я знаю, что это неверный HTML. Я использую это, чтобы исправить неверный HTML и использовать HTMLEncode на знаках «меньше»
Пожалуйста, направьте меня в правильном направлении. заранее спасибо
Html Agility Packs обнаруживает это как ошибку и создает для него экземпляр HtmlParseError. Вы можете прочитать все ошибки, используя класс ParseErrors класса HtmlDocument. Итак, если вы запустите этот код:
string s = "<span style=\"color: #0000FF;\"><</span>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(s);
doc.Save(Console.Out);
Console.WriteLine();
Console.WriteLine();
foreach (HtmlParseError err in doc.ParseErrors)
{
Console.WriteLine("Error");
Console.WriteLine(" code=" + err.Code);
Console.WriteLine(" reason=" + err.Reason);
Console.WriteLine(" text=" + err.SourceText);
Console.WriteLine(" line=" + err.Line);
Console.WriteLine(" pos=" + err.StreamPosition);
Console.WriteLine(" col=" + err.LinePosition);
}
Он отобразит это (сначала скорректированный текст и подробности об ошибке):
<span style="color: #0000FF;"></span>
Error
code=EndTagNotRequired
reason=End tag </> is not required
text=<
line=1
pos=30
col=31
Поэтому вы можете попытаться исправить эту ошибку, так как у вас есть вся необходимая информация (включая позицию строки, столбца и потока), но общий процесс исправления (не обнаруживать) ошибок в HTML очень сложный.
Как упоминалось в другом ответе, лучшим решением, которое я нашел, было предварительное разбор HTML-кода для преобразования потерянных <
символов в их кодированное HTML-значение <
,
return Regex.Replace(html, "<(?![^<]+>)", "<");