HTML Agility Pack: selezionare i nodi dopo il nodo specifico

asp.net c# html html-agility-pack

Domanda

Ho posto la domanda in una discussione su codeplex ma spero di ottenere una risposta più rapida qui su StackOverflow.

Quindi, utilizzo HTML Agility Pack per l'analisi HTML in C #. Ho la seguente struttura 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>

E ho bisogno di ottenere tutti gli elementi p con il "paragrafo" di classe che esiste dopo l'elemento p con la classe "specifica".

C'è un modo per farlo?

Grazie.

Risposta accettata

usando .Class come nell'esempio di Mark (se ciò non esiste, sostituisci ciò che è appropriato)

Usa SkipWhile

per esempio in LINQPad ottieni 5,6,7 da:

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

Quindi, in base al tipo SelectNodes restituisce, o:

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

o

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

(o, brutta versione)

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

(o in alcuni casi - non se la tua espressione sta già filtrando in modo appropriato)

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

EDIT: probabilmente creerei un metodo di estensione:

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

Qualcuno ha cura di cercare l'arte antecedente per questo? Qualche suggerimento di buon nome?


Risposta popolare

Prova questo

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché