HtmlAgilityPack Drops Option End Tags

html html-agility-pack parsing

Вопрос

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

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

Это делает некоторые неожиданные вещи. Во-первых, он дает две ошибки парсера, EndTagNotRequired. Во-вторых, узел выбора имеет 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 не может делать то, что я хочу, можете ли вы порекомендовать что-то, что может?

Принятый ответ

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

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

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

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

ДОБАВИТЬ

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


Популярные ответы

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

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

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

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



Related

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