Конечные теги опций HtmlAgilityPack

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

для всех, кто сталкивается с этой проблемой, см. мой ответ на stackoverflow.com/questions/759355/…, чтобы узнать о методе установки ответа bobnce без изменения источника HAP.

MaxPRafferty 23.08.2012 21:05
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
24
1
8 420
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Точно такая же ошибка сообщается при обсуждении домашней страницы 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");

Jason Morse 25.01.2011 01:48

Привет, Джейсон, как вы на самом деле решили эту проблему прямо в собственном коде? Я пробовал HtmlNode.ElementsFlags.Remove ("option"); в моем коде, но это не решило проблему с закрывающим тегом img? Не могли бы вы дать мне подробности, я не хочу изменять и перекомпилировать исходный код, если мне не нужно. Большое спасибо!

Ray 26.04.2012 08:16

@ ray247 Я попробовал этот HtmlNode.ElementsFlags.Remove("option"); один раз в статическом конструкторе, и ошибки EndTagNotRequired исчезли

user586399 13.03.2014 11:58

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

Мое предложение - заменить всю строку и заменить все теги option на my_option, таким образом вы:

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

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

Другие вопросы по теме