Как получить все элементы ввода в форме с HtmlAgilityPack без получения нулевой ссылочный ошибки

c# html html-agility-pack parsing

Вопрос

Пример HTML:

 <html><body>
     <form id="form1">
       <input name="foo1" value="bar1" />
       <!-- Other elements -->
     </form>
     <form id="form2">
       <input name="foo2" value="bar2" />
       <!-- Other elements -->
     </form>   
 </body></html>

Тестовый код:

HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\test.html");
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input"))
{
    Console.WriteLine(node.Attributes["value"].Value);            
}

Заявление doc.GetElementbyId("form2").SelectNodes(".//input") дает мне нулевую ссылку.

Что-нибудь я сделал не так? Благодарю.

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

Вы можете сделать следующее:

HtmlNode.ElementsFlags.Remove("form");

HtmlDocument doc = new HtmlDocument();

doc.Load(@"D:\test.html");

HtmlNode secondForm = doc.GetElementbyId("form2");

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

    if (valueAttribute != null)
    {
        Console.WriteLine(valueAttribute.Value);
    }
}

По умолчанию HTML Agility Pack обрабатывает формы как пустой узел, потому что им разрешено пересекать другие элементы HTML. Первая строка ( HtmlNode.ElementsFlags.Remove("form"); ) отключает это поведение, позволяя вам получить входные элементы во второй форме.

Обновление: Пример перекрытия элементов формы:

<table>
<form>
<!-- Other elements -->
</table>
</form>

Элемент начинается внутри таблицы, но закрывается за пределами элемента таблицы. Это разрешено в спецификации HTML, и HTML Agility Pack должен иметь дело с этим.


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

Просто введите их в массив:

HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");



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