HTML Agility Pack - Sélectionnez des nœuds après un nœud spécifique

asp.net c# html html-agility-pack

Question

J'ai posé la question lors d'une discussion sur le codeplex, mais j'espère obtenir une réponse plus rapide ici à stackoverflow.

J'utilise donc HTML Agility Pack pour l'analyse HTML en C #. J'ai la structure html suivante:

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

Et je dois obtenir tous les éléments p avec la classe "paragraphe" qui existent après l'élément p avec la classe "spécifique".

Y-a-t-il un moyen de faire ça?

Merci.

Réponse acceptée

en utilisant .Class comme dans l'exemple de Mark (si cela n'existe pas, remplacez ce qui est approprié)

Utilisez SkipWhile

par exemple, dans LINQPad, vous obtenez 5,6,7 de:

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

Donc, en fonction du type renvoyé par SelectNodes, soit:

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

ou

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

(ou version laide)

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

(ou dans certains cas - pas si votre expression filtre déjà correctement)

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

EDIT: Je créerais probablement une méthode d'extension:

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

Quelqu'un se soucie de rechercher dans l'art antérieur pour cela? Des suggestions de bon nom?


Réponse populaire

Essaye ça

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi