Опция HtmlAgilityPack Drops End Tags - PullRequest
       16

Опция HtmlAgilityPack Drops End Tags

23 голосов
/ 16 ноября 2008

Я использую 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 не может делать то, что я хочу, можете ли вы порекомендовать что-то, что может?

Ответы [ 2 ]

31 голосов
/ 16 ноября 2008

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

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

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

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

ADD

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

5 голосов
/ 05 ноября 2010

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

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

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

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

...