web-dev-qa-db-ja.com

null参照エラーを取得せずにHtmlAgilityPackを使用してフォーム内のすべての入力要素を取得する方法

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")はnull参照を与えます。

私が間違ったことはありますか?ありがとう。

23
Bill Li

次のことができます。

_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");)はこの動作を無効にし、2番目のフォーム内の入力要素を取得できるようにします。

更新:フォーム要素のオーバーラップの例:

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

要素はテーブルの内側で始まりますが、テーブル要素の外側で閉じられます。これはHTML仕様で許可されており、HTML AgilityPackで処理する必要があります。

42
João Angelo

それらを配列に入れるだけです:

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