Формулировка формы с помощью пакета Agility Pack

c# html-agility-pack

Вопрос

Я пытаюсь извлечь все элементы ввода из формы. Когда я разбираю следующую форму:

<form>
<input name='test1' type='text'>
<input name='test2' type='text'>
<input name='test3' type='text'>
</form>

все работало отлично, HTML Agility Pack смог обнаружить входные элементы в форме, но если у него есть родительский узел div, такой как следующий, он не будет обнаружен.

<form>
<div><input name='test1' type='text'></div>
<div><input name='test2' type='text'></div>
<div><input name='test3' type='text'></div>
</form>

Я использую следующий код

HtmlNode.ElementsFlags.Remove("form");

foreach (HtmlAgilityPack.HtmlNode node in postForm.Elements("input"))
{
    HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"];
}

Может ли кто-нибудь сказать мне, что пошло не так? благодаря

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

Метод HtmlNode.Elements получает соответствие имени дочерних узлов первого поколения. После ввода ваших входов в <div> они становятся дочерними узлами второго поколения для элемента формы.

Чтобы заставить ваш код работать с использованием метода HtmlNode.Descendants который получает все узлы-потомки с соответствующим именем:

foreach (HtmlAgilityPack.HtmlNode node in postForm.Descendants("input"))
{
   HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"];
}

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

Используйте Descendants() вместо Elements() - позже работает только с прямыми дочерними элементами, но ваши входные элементы вложены в divs:

 foreach (HtmlAgilityPack.HtmlNode node in postForm.Descendants("input"))
 {
     HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"];
 }


Related

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