HTML Agility Packを使用したDOMのトラバース

c# html-agility-pack

質問

HTML Agility Packを使用してDOMをトラバースする方法を理解するのに問題があります。

たとえば、 id="gbqfsa"要素を探したいとしましょう。

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(Url);
            var foo = from bar in doc.DocumentNode.DescendantNodes()
                          where bar.Attributes["id"].Value == "gbqfsa"
                          select bar.InnerText;

今私はこれをやっています(上記)が、 foonullとして出てきnull 。私は間違って何をしていますか?

編集:これは私が使用していたifステートメントです。私は、 InnerTextの要素が「Google検索」と等しいかどうかを確認するためにテストしていました。

if (foo.Equals("Google Search"))
            {
                HasSucceeded = 1;
                MessageBox.Show(yay);
            }
            else
            {
                MessageBox.Show("kms");
            }
            return HasSucceeded;

受け入れられた回答

あなたがすべきことは次のとおりです:

var foo = (from bar in doc.DocumentNode.DescendantNodes()
          where bar.GetAttributeValue("id", null) == "gbqfsa"
          select bar.InnerText).FirstOrDefault();

FirstOrDefault()を忘れて、 where条件を満たす最初の要素を選択します。

そして、私はAttributes["id"].Valueを置き換えAttributes["id"].Value GetAttributeValue("id", null)は、要素にid属性がある場合に例外をスローしません。


人気のある回答

私はfoonullとして出てくるとは思わない。おそらく、すべての子孫ノードが "id"プロパティを持っているわけではないので、 bar.Attributes["id"]はツリー内のいくつかの要素ではnullです。 GetAttributeValueメソッドを使用することをお勧めします。このメソッドは、属性が見つからない場合に既定値を返します。

var foo = from bar in doc.DocumentNode.DescendantNodes()
            where bar.GetAttributeValue("id", null) == "gbqfsa"
            select bar.InnerText;


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow