Paquete de agilidad HTML: seleccionar nodos después de un nodo específico

asp.net c# html html-agility-pack

Pregunta

Hice la pregunta en una discusión de codeplex pero espero obtener una respuesta más rápida aquí en stackoverflow.

Por lo tanto, uso HTML Agility Pack para el análisis de 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 necesito obtener todos los elementos p con la clase "párrafo" que existe después del elemento p con la clase "específica".

¿Hay una manera de hacer eso?

Gracias.

Respuesta aceptada

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

Utilice SkipWhile

Por ejemplo, en LINQPad obtienes 5,6,7 de:

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

Entonces, dependiendo del tipo que devuelve SelectNodes, puede:

.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 ya se está filtrando adecuadamente)

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

EDITAR: probablemente crearía 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);
       }
}

¿Alguien quiere buscar el estado de la técnica para esto? ¿Alguna sugerencia de buen nombre?


Respuesta popular

Prueba esto

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

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué