HTML敏捷性パック - 特定のノードの後にノードを選択
-
19-09-2019 - |
質問
私は質問をのCodePlex議論するではなく、私は願っていますstackoverflowの時にここに迅速に答えを取得します。
は、だから、私はC#でHTML解析用HTML敏捷性パックを使用します。 私は、次の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要素「特定」の後に存在している。
それを行う方法はありますか?
感謝します。
解決
のマークの例のように.Classを使用して(そのdoesntのが存在する場合、適切であるどんな代替)
を使用 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);
}
}
所属していません StackOverflow