2009-12-14 16 views
8

Hice la pregunta in a codeplex discussion pero espero obtener una respuesta más rápida aquí en stackoverflow.HTML Agility Pack: seleccione nodos después del nodo específico

Por lo tanto, utilizo HTML Agility Pack para analizar HTML en C#. tengo la siguiente estructura 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> 

Y tengo que conseguir todos los elementos p con clase "punto" que existen después de que el elemento p con la clase "específica".

¿Hay alguna manera de hacerlo?

Gracias.

Respuesta

6

usando .Class como en el ejemplo de Mark (si existe eso no, el sustituto de lo que sea apropiado)

Uso SkipWhile

por ejemplo en LINQPad se obtiene 5,6,7 de:

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

Así que dependiendo devuelve el tipo SelectNodes, ya sea:

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

o

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

(o, versión fea)

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

(o en algunos casos - no si su expresión está ya filtrando adecuadamente)

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

EDIT: Me gustaría probablemente crear un método de extensión:

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

A alguien le importa a buscar hasta la técnica para este ? ¿Alguna sugerencia de buen nombre?

+0

SkipWhile es genial +1 –

+0

Esto es exactamente lo que necesitaba. Gracias. – morsanu

+0

Lo usaré yo mismo pronto, así que ¡gracias por preguntar! –

2

Prueba este

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

Supongo que solo revisó la pregunta, no la leyó. :) Analizo el HTML en C# con HTML Agility Pack, y necesito seleccionar solo las etiquetas p con class = "paragraph" que están después de la etiqueta p con class = "specific". – morsanu

+0

Disculpe por eso, espero que esta respuesta sea más útil (necesitará una referencia a System.Linq). :) –

+0

Eso seleccionará TODAS las etiquetas p con la clase "párrafo". Solo necesito los DESPUÉS de la etiqueta p con class = "specific". – morsanu

Cuestiones relacionadas