2009-12-14 6 views
8

J'ai posé la question in a codeplex discussion mais j'espère obtenir une réponse plus rapide ici à stackoverflow. Donc, j'utilise HTML Agility Pack pour l'analyse HTML en C#. J'ai la structure html suivante:HTML Agility Pack - Sélectionner les nœuds après un nœud spécifique

<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 classe « paragraphe » qui existent après l'élément p avec classe « spécifique ».

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

Merci.

Répondre

6

utilisant .Class comme dans l'exemple de Mark (si cela ne marche pas exister, remplacer tout ce qui est approprié)

Utilisez SkipWhile

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

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

selon Donc, sur les rendements de son type, soit:

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

ou

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

(ou version laid)

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

(ou dans certains cas - pas si votre expression est le filtrage déjà de façon appropriée)

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

EDIT: Je serais probablement créer 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 veut rechercher des art antérieur pour cette ? De bonnes suggestions de noms?

+0

SkipWhile is cool +1 –

+0

C'est exactement ce dont j'avais besoin. Merci. – morsanu

+0

Je vais bientôt l'utiliser moi aussi, merci d'avoir posé cette question! –

2

Essayez cette

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

Je suppose que vous venez de regarder par-dessus la question, pas réellement le lire. :) J'analyse le HTML en C# avec HTML Agility Pack, et je n'ai besoin de sélectionner que les balises p avec class = "paragraph" qui sont après la balise p avec class = "specific". – morsanu

+0

Désolé, nous espérons que cette réponse sera plus utile (vous aurez besoin d'une référence à System.Linq). :) –

+0

Cela va sélectionner TOUS les tags p avec la classe "paragraph". Je n'ai besoin que de ceux qui suivent le tag p avec class = "specific". – morsanu