HtmlAgilityPack удаляет конечные теги опции
-
08-07-2019 - |
Вопрос
Я использую 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 р>