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参照を与えます。
私が間違ったことはありますか?ありがとう。
次のことができます。
_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で処理する必要があります。
それらを配列に入れるだけです:
HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");