Может ли пакет HTMLAgility оставить закрытые теги?

c# html-agility-pack

Вопрос

Мне нужно проанализировать HTML-строку следующим образом:

<widget attribute="1">
  <header>
    <table>
  </header>
  <item>
    <tr><td>content</td></tr>
  </item>
  <footer>
    </table>
  </footer>
</widget>

Я использую Html Agility Pack, и я могу найти все «виджеты»:

HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionOutputAsXml = false;
doc.LoadHtml(htmlString); 
HtmlNodeCollection widgets = doc.DocumentNode.SelectNodes("//widget");

Моя проблема в том, что я пытаюсь получить все дочерние элементы узла Widget. HTMLAgility автоматически закрывает все мои теги, поэтому я не могу правильно получить узлы заголовка, элемента и нижнего колонтитула. Результат, создаваемый Agility:

<header>
    <table>
</table></header>
<item>
    <tr>
        <td><p>Riga n.1</p></td>
    </tr>
</item>
<footer>

</footer>

Он закрывает тег таблицы в заголовке и скрывает тег таблицы в нижнем колонтитуле. Есть способ оставить эти теги незакрытыми? Я попытался найти документацию о логике метода LoadHtml, но я ничего не нашел. Мне кажется, мне нужно играть с опциями.

Вы можете мне помочь?

Популярные ответы

Html Agility Pack обычно не поддерживает перекрывающиеся теги по дизайну. Однако вы можете настроить его следующим образом:

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags.Add("table", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
doc.LoadHtml(htmlString); 

В этом случае вы даете указание библиотеке рассматривать TABLE как перекрывающийся тег. В качестве примечания стороны FORM является единственным TAG по умолчанию, определяемым как перекрывающий тег (см. Причину здесь: HtmlAgilityPack - по какой-то причине закрывает ли форма? ).

Однако это не бесплатный обед ...

Это значит, что теперь библиотека увидит, что находится внутри таблицы, и закрывает теги таблицы как чистый текстовый элемент. Таким образом, все теги внутри анализируемой таблицы не будут программно доступны, вы не увидите их в DOM, вы не увидите его с помощью XPATH и т. Д., Но этого может быть достаточно для ваших нужд.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow