HTML Agility Pack - 特定のノードの後に​​ノードを選択する

asp.net c# html html-agility-pack

質問

私は、 コードプレックスの議論の質問をしたが、私はここでstackoverflowでより迅速な答えを得ることを望む。

ですから、私はC#でHTML解析のためにHTML Agility Packを使用します。私は次のhtml構造を持っています:

<body>
   <p class="paragraph">text</p>
   <p class="paragraph">text</p>
   <p class="specific">text</p>
   <p class="paragraph">text</p>
   <p class="paragraph">text</p>
</body>

そして、クラス "特定"のp要素の後に存在するクラス "段落"を持つすべてのp要素を取得する必要があります。

それを行う方法はありますか?

ありがとう。

受け入れられた回答

Markの例のように.Classを使用します(存在しない場合は、適切なものを置き換えてください)

SkipWhileを使用する

例: LINQPadで 5,6,7を得る:

int[] a = { 6, 5, 6 ,7 };
a.SkipWhile(x=>x!=6).Skip(1).Dump();

SelectNodesの型に応じて、次のいずれかが返されます。

.SelectNodes( "/p" ).SkipWhile( p => p.Class != "specific" ).Skip(1)

または

.SelectNodes( "/p" ).Cast<XX>().SkipWhile( p => p.Class != "specific" ).Skip(1)

(または、醜いバージョン)

.SelectNodes( "/p" ).SkipWhile( p => ((XX)p).Class != "specific" ).Skip(1)

(または、場合によっては、あなたの表現がすでに適切にフィルタリングされていない場合)

.SelectNodes( "/p" ).OfType<XX>().SkipWhile( p => p.Class != "specific" ).Skip(1)

編集:私はおそらく拡張メソッドを作成するだろう:

static class HapExtensions
{
    public IEnumerable<T> SkipUntilAfter( this IEnumerable<T> sequence, Predicate<T> predicate) {
        return sequence.SkipWhile( predicate).Skip(1);
       }
}

誰でもこの先行技術を検索するのに気をつけますか?いい名前の提案?


人気のある回答

これを試して

bool latterDayParagraphs = false;
List<DocumentNode> nodes = new List<DocumentNode>();
foreach(var pElement in doc.DocumentNode.SelectNodes("/p"))
{
   if(pElement.Class != "paragraph") 
   {
      latterDayParagraphs = true;
      continue;
   }
   if(latterDayParagraphs)
   {
      nodes.Add(pElement);
   }
}



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