Подтвердить что ты не робот

HtmlAgilityPack Drops Option End Tags

Я использую HtmlAgilityPack. Я создаю HtmlDocument и LoadHtml со следующей строкой:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

Это делает некоторые неожиданные вещи. Во-первых, он дает две ошибки парсера, EndTagNotRequired. Во-вторых, выбор node имеет 4 детей - два для тегов параметров и еще два для внутреннего текста тегов параметров. Наконец, OuterHtml выглядит следующим образом:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>

Итак, в основном, я решаю, чтобы оставить закрывающие теги в параметрах. Оставьте на минутку, нужно ли это правильно и желательно сделать это. Я использую HtmlAgilityPack для проверки кода генерации HTML, поэтому я не хочу, чтобы он принимал какое-либо решение для меня или давал какие-либо ошибки, если HTML не искажен. Есть ли способ заставить его вести себя так, как я хочу? Я попытался установить некоторые параметры для HtmlDocument, в частности:

 doc.OptionAutoCloseOnEnd = false;
 doc.OptionCheckSyntax = false;
 doc.OptionFixNestedTags = false;

Это не работает. Если HtmlAgilityPack не может делать то, что я хочу, можете ли вы порекомендовать что-то, что может?

4b9b3361

Ответ 1

Точно такая же ошибка сообщается в обсуждении на домашней странице HAP, но, похоже, никаких значительных исправлений в проекте не было сделано через несколько лет. Не обнадеживает.

Быстрый просмотр источника предполагает, что ошибка может быть исправлена ​​путем комментирования строки 92 из HtmlNode.cs:

// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);

(На самом деле нет, они всегда содержат текст меток, хотя пустая строка также является допустимым текстом. Небрежный автор может опустить конечный тег, но тогда это верно для любого элемента.)

ADD

Эквивалентное решение вызывает HtmlNode.ElementsFlags.Remove("option"); перед любым использованием либерала (без необходимости изменять освобождающий исходный код)

Ответ 2

Похоже, что есть некоторая причина не анализировать тег Option как "общий" тег для соответствия XHTML, но это может быть настоящей болью в шее.

Мое предложение состоит в том, чтобы выполнить замену целых строк и изменить все теги "option" на теги "my_option", чтобы вы:

  • Не нужно изменять источник библиотеки (и позже ее можно обновить).
  • Может анализировать, как обычно.

Оригинальное сообщение на форуме HtmlAgilityPack можно найти по адресу: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982