8

コードプレックスのディスカッションで質問しましたが、ここでスタックオーバーフローでより迅速な回答を得たいと考えています。

そのため、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 要素を取得する必要があります。

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

ありがとう。

4

2 に答える 2

6

マークの例のように .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);
       }
}

これについて先行技術を検索したい人はいますか?良い名前の候補はありますか?

于 2009-12-14T10:06:06.633 に答える
2

これを試して

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);
   }
}
于 2009-12-14T09:10:07.067 に答える