HtmlAgilityPack: ¿Cómo combino elementos html juntos en una etiqueta con una clase?

html-agility-pack vb.net

Pregunta

Problema: necesito examinar algunos elementos HTML usando HtmlAgilityPack y combinar los nombres de las etiquetas. ¿Es posible extraer cada etiqueta, de la matriz a la secundaria, reemplazándola con un intervalo que tiene una clase con un nombre de "strikeUEmStrong"? Además, el nombre cambia según el elemento HTML.

El orden del nombre de la clase en realidad importa, me di cuenta de esto a través de prueba y error. Siempre y cuando sea capaz de obtener todos los elementos y combinarlos. Es muy posible que tenga varios nodos de texto con varios niveles de formato.

Esto afectará a varios párrafos.

Por ejemplo, si tengo este código html:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

¿Cómo lo convierto a esto?

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

Es posible tener este tipo de código también:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

La salida debería verse así:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

Prototipo:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

Salida:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

Finalmente obteniendo la salida correcta, después de que solucioné el problema de pedido. Gracias por la ayuda.

Respuesta aceptada

Esta no es una pregunta directa para responder. Describiré cómo escribiría el algoritmo para hacer esto, e incluiré un pseudo código para ayudar.

  1. Obtendría mi etiqueta de padre. Asumiré que quieres hacer esto para todas las etiquetas "p"
  2. Recorrí las etiquetas de mis hijos, tomando el nombre de la etiqueta y añadiéndolo a un nombre de clase
  3. Recursivamente iteraba a los niños hasta que obtuve el nombre de mi etiqueta adjunta

Pseudo-código. Por favor, disculpe cualquier error tipográfico, ya que estoy escribiendo esto sobre la marcha.

public string GetClassName(Node n)
{
var ret = n.TagName;

foreach(var child in n.ChildNodes)
{
ret += GetClassName(child);
}

return ret;
}


foreach(var p in paragraphs)
{
foreach(var child in p.ChildNodes)
{
 var span = new Span();
 span.InnerText = child.InnerText; // strip all tags, just take the inner text

span.ClassName = GetClassName(child);

child.ReplaceWith(span); // note: if you do this with a FOREACH and not a for loop, it'll blow up C# for modifying the collection while iterating.  Use for loops. if you're going to do "active" replacement like in this pseudo code
}
}

Estaré encantado de modificar mi respuesta una vez que tenga más contexto. Por favor revise lo que estoy sugiriendo y coméntelo con más contexto si necesita que refine mi sugerencia. Si no, espero que esto te consiga lo que necesitas :)




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é