Я использую 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"); перед любым использованием библиотеки (без необходимости изменения исходного кода).
Я столкнулся с этой проблемой, пытаясь получить значение параметра InnerText. Я применил ваше решение непосредственно в своем коде, используя статическую HashTable HtmlNode: HtmlNode.ElementsFlags.Remove ("option");
Привет, Джейсон, как вы на самом деле решили эту проблему прямо в собственном коде? Я пробовал HtmlNode.ElementsFlags.Remove ("option"); в моем коде, но это не решило проблему с закрывающим тегом img? Не могли бы вы дать мне подробности, я не хочу изменять и перекомпилировать исходный код, если мне не нужно. Большое спасибо!
@ ray247 Я попробовал этот HtmlNode.ElementsFlags.Remove("option"); один раз в статическом конструкторе, и ошибки EndTagNotRequired исчезли
Кажется, что есть какая-то причина не анализировать тег Option как «общий» тег для соответствия XHTML, однако это может быть настоящей головной болью.
Мое предложение - заменить всю строку и заменить все теги option на my_option, таким образом вы:
Исходное сообщение на форуме HtmlAgilityPack можно найти по адресу: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982
для всех, кто сталкивается с этой проблемой, см. мой ответ на stackoverflow.com/questions/759355/…, чтобы узнать о методе установки ответа bobnce без изменения источника HAP.