24

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 参照を提供します。

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

4

2 に答える 2

44

次のことができます。

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 Agility Pack はこれに対処する必要があります。

于 2010-03-05T15:53:06.917 に答える