HtmlAgilityPackとノードとサブノードの選択

c# html-agility-pack xpath

質問

誰かが私を助けることを願っています。

私は、この例のように複数のdivが含まれているhtmlドキュメントがあるとしましょう:

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

私はHTML文書を取得するためにHtmlAgilityPackを使用しています。私が知る必要があるのは、どのように各 "search_hit" -divのスパンを得ることができるかです。

私の最初の考えは次のようなものでした:

foreach (HtmlAgilityPack.HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
     foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("//span[@prop]"))
     {

     }
}

各divは、含まれるスパンをプロパティとして持つオブジェクトでなければなりません。 I.

public class Record
    {
        public string Name { get; set; }
        public string company { get; set; }
        public string street { get; set; }
    }

そして、このリストは満たされるでしょう:

public List<Record> Results = new List<Record>();

しかし、私が使用しているXPATHは、サブノード内で検索を実行していません。これは、文書全体を何度も何度も検索しています。

私は既に、私はそれがページ全体のスパンを取得するように、その方法で働いていることを意味します。しかし、私はスパンとディビジョンの間には関係がありません。手段:どのスパンがどのdivに関連しているかはもう分かりません。

誰かが解決策を知っていますか?私はすでにそれの周りに私は完全に今混乱して遊んだ:)

どんな助けもありがとう!

受け入れられた回答

以下は私のために働く。重要なビットは、BeniBelaが「SelectNodes」への2番目の呼び出しでドットを追加すると述べたのと同じです。

List<Record> lstRecords=new List<Record>();
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
  Record record=new Record();
  foreach (HtmlNode node2 in node.SelectNodes(".//span[@prop]"))
  {
    string attributeValue = node2.GetAttributeValue("prop", "");
    if (attributeValue == "name")
    {
      record.Name = node2.InnerText;
    }
    else if (attributeValue == "company")
    {
      record.company = node2.InnerText;
    }
    else if (attributeValue == "street")
    {
      record.street = node2.InnerText;
    }
  }
  lstRecords.Add(record);
}

人気のある回答

//を使用すると、ドキュメントbeginから検索します。

.//を使用して、現在のノードからすべてを検索する

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes(".//span[@prop]"))

または、接頭辞を完全に削除して直接の子のみを検索します。

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("span[@prop]"))


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ