Пакет Agility Pack - проблема с выбором тега select HTML с тегами параметров внутри

.net c# dom html-agility-pack

Вопрос

Я использую HTML Agility Pack, чтобы выбрать элемент и вернуть этот элемент и все, что он содержит, из загруженной строки html. При тестировании моего кода я запускал его против примера select tag из w3schools:

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

Когда я пытаюсь выбрать и возвратить это с помощью пакета гибкости HTML, я получаю (удаляются теги закрытия опций):

<select name="cars">
  <option value="volvo">Volvo XC90
  <option value="saab">Saab 95
  <option value="mercedes">Mercedes SLK
  <option value="audi">Audi TT
</select>

Поэтому я сделал некоторые поиски здесь и нашел инструкцию для добавления строки: HtmlNode.ElementsFlags.Remove («option»);

Я сделал это, и теперь я получаю (текст параметров перемещается за пределы тегов параметров):

<select name="cars">
  <option value="volvo"></option>Volvo XC90
  <option value="saab"></option>Saab 95
  <option value="mercedes"></option>Mercedes SLK
  <option value="audi"></option>Audi TT
</select>

Я хотел бы, чтобы результат соответствовал исходному HTML. Что мне нужно сделать, чтобы получить это?

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

Это мой код .NET C #:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(content);
HtmlNode.ElementsFlags.Remove("option"); // otherwise, the closing tag is removed.

//doc.OptionWriteEmptyNodes = true;

var nodes = doc.DocumentNode.SelectNodes("//select");

if (nodes == null)
    return "Not found";
else
    return nodes[0].OuterHtml;

Принятый ответ

Вам нужно установить поле ElementsFlag для тега опции, чтобы он работал

HtmlNode.ElementsFlags["option"] = HtmlElementFlag.Closed;

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

который должен вернуть исходный код HTML.

Я считаю, что причина, по которой HtmlAgilityPack ведет себя таким образом, состоит в том, что <option> -tag по иронии судьбы является необязательным тегом в HTML, который не требует закрывающего тега.

Взято из документации класса HtmlNode и его поля ElementsFlags :

Получает коллекцию флагов, которые определяют конкретные поведения для конкретных узлов элемента. Таблица содержит список DictionaryEntry с наименьшим именем тега в качестве ключа и комбинацию HtmlElementFlags как значения.

Далее рассмотрим перечисления HtmlElementFlag :

Пусто. Узел пуст. Примерами таких узлов являются META или IMG. Закрыто - узел будет автоматически закрыт во время разбора.

Вы можете просмотреть исходный код класса HtmlNode, чтобы узнать, какие другие теги считаются «конкретными».



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему