HTML Agility Pack - 在特定节点之后选择节点

mor*_*anu 8 html c# asp.net html-agility-pack

在codeplex讨论中提出了这个问题,但我希望能在stackoverflow上得到更快的答案.

因此,我使用HTML Agility Pack在C#中进行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>
Run Code Online (Sandbox Code Playgroud)

而且我需要获得所有带有"段落"的p元素,这些元素存在于带有"特定"类的p元素之后.

有没有办法做到这一点?

谢谢.

Rub*_*ink 6

在Mark的例子中使用.Class(如果不存在,替换任何适当的)

使用SkipWhile

例如,在LINQPad中你可以得到5,6,7:

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

因此,根据SelectNodes类型的返回,可以:

.SelectNodes( "/p" ).SkipWhile( p => p.Class != "specific" ).Skip(1)
Run Code Online (Sandbox Code Playgroud)

要么

.SelectNodes( "/p" ).Cast<XX>().SkipWhile( p => p.Class != "specific" ).Skip(1)
Run Code Online (Sandbox Code Playgroud)

(或丑陋的版本)

.SelectNodes( "/p" ).SkipWhile( p => ((XX)p).Class != "specific" ).Skip(1)
Run Code Online (Sandbox Code Playgroud)

(或者在某些情况下 - 如果你的表达式已经适当过滤,则不会

.SelectNodes( "/p" ).OfType<XX>().SkipWhile( p => p.Class != "specific" ).Skip(1)
Run Code Online (Sandbox Code Playgroud)

编辑:我可能会创建一个扩展方法:

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

有人关心为此搜索现有技术吗?有什么好名字的建议?