2008-11-16 2 views
22

Я использую HtmlAgilityPack. Я создаю HtmlDocument и LoadHtml со следующей строкой:HtmlAgilityPack Drops Option End Tags

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select> 

Это делает некоторые неожиданные вещи. Во-первых, он дает две ошибки парсера, EndTagNotRequired. Во-вторых, узел выбора имеет 4 дочерних элемента - два для тегов параметров и еще два для внутреннего текста тегов параметров. И последнее, OuterHtml как это:

Так в основном это решает для меня отказаться от закрытия тегов на опции. Оставим на минутку, правильно ли и желательно это сделать. Я использую HtmlAgilityPack для проверки кода генерации HTML, поэтому я не хочу, чтобы он принимал какое-либо решение для меня или давал какие-либо ошибки, если HTML не искажен. Есть ли способ заставить его вести себя так, как я хочу? Я попытался установить некоторые параметры для HtmlDocument, в частности:

doc.OptionAutoCloseOnEnd = false; 
doc.OptionCheckSyntax = false; 
doc.OptionFixNestedTags = false; 

Это не работает. Если HtmlAgilityPack не может делать то, что я хочу, можете ли вы порекомендовать что-то, что может?

+0

для тех, кто еще сталкивается этот вопрос, увидеть мой ответ на http://stackoverflow.com/questions/759355/image-tag-not -closing-with-htmlagilitypack/12096383 # 12096383 для метода настройки ответа bobnce без изменения источника HAP. – MaxPRafferty 2012-08-23 17:05:13

ответ

30

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

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

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

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

ADD

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

+0

Awesome. Большое спасибо. Прекрасно работает! – 2008-11-17 05:02:18

5

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

Мое предложения сделать целую строку замены и изменить все тэги «опции» метку «my_option», что, как вы:

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

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