Потеря знака «меньше» в HtmlAgilityPack loadhtml

c# html html-agility-pack

Вопрос

Недавно я начал экспериментировать с 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-значение &lt; ,

return Regex.Replace(html, "<(?![^<]+>)", "&lt;");


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему