Вопрос

Я использую 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 как " generic " тег, для соответствия XHTML, однако это может быть реальная боль в шее.

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

<Ол>
  • Не нужно изменять источник библиотеки (и можно обновить его позже).
  • Можно анализировать, как обычно.
  • Оригинальное сообщение на форуме HtmlAgilityPack можно найти по адресу: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top