HTML Agility Pack - Wählen Sie Knoten nach bestimmten Knoten aus

asp.net c# html html-agility-pack

Frage

Ich habe die Frage in einer Codeplex-Diskussion gestellt, aber ich hoffe, hier bei stackoverflow eine schnellere Antwort zu bekommen.

Daher verwende ich HTML Agility Pack für die HTML-Analyse in C #. Ich habe die folgende HTML-Struktur:

<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>

Und ich muss alle p-Elemente mit der Klasse "paragraph" erhalten, die nach dem p-Element mit der Klasse "specific" existieren.

Gibt es eine Möglichkeit, das zu tun?

Vielen Dank.

Akzeptierte Antwort

Verwenden von .Class wie in Marks Beispiel (wenn das nicht existiert, ersetzen Sie das, was passend ist)

Verwenden Sie SkipWhile

zB in LINQPad erhalten Sie 5,6,7 von:

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

Also abhängig von dem Typ, den SelectNodes zurückgibt, entweder:

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

oder

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

(oder, hässliche Version)

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

(oder in einigen Fällen - nicht, wenn Ihr Ausdruck bereits entsprechend gefiltert wird)

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

EDIT: Ich würde wahrscheinlich eine Erweiterungsmethode erstellen:

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

Wer interessiert sich dafür, den Stand der Technik zu suchen? Irgendwelche guten Namensvorschläge?


Beliebte Antwort

Versuche dies

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);
   }
}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum