HtmlAgilityPack - Reemplace el nodo con otro nodo

asp.net c# html-agility-pack vb.net

Pregunta

Tengo dos nodos que tienen HTML interno que dice algo como esto:

Nodo1:

<p>some text</p>
<p>some more text</p>

Nodo2:

<p>some text</p>
<p>some more text</p>
<div><p>lots of more paragraphs here</p></div>

Estoy intentando buscar Nodo1 en Nodo2 para agregar la etiqueta <!--more--> (para publicaciones de WordPress) después de los dos primeros párrafos (o cualquier texto HTML que se suministre en Nodo1).

Los dos nodos anteriores tienen padres diferentes. ¿Cómo puedo encontrar y reemplazar o agregar la etiqueta <!--more--> en tal caso? Intenté ejecutar el siguiente código, pero falla:

Código:

node2.ParentNode.ReplaceChild(HtmlNode.CreateNode(node1.InnerHtml & "<!--more-->"), node1).InnerHtml

Error:

Node "

             " was not found in the collection
Parameter name: node

También probamos chaging node1 en la parte oldChild a HtmlNode.CreateNode(node1.InnerHtml) , pero eso no funcionó bien.

Respuesta aceptada

Creo que sería más fácil realizar un reemplazo directamente en la propiedad HtmlNode.InnerHtml :

node2.InnerHtml = node2.InnerHtml.Replace(
    node1.InnerHtml, 
    node1.InnerHtml + "<!--more-->"
);

Respuesta popular

No está seguro de por qué la sustitución no funciona, sin embargo, hay un método InsertAfter que puede usar.

const string html = @"<p>some text</p>
<p>some more text</p>
<div><p>lots of more paragraphs here</p></div>";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var secondParagraph = doc.DocumentNode.SelectSingleNode("//p[2]");
// var secondParagraph = doc.DocumentNode.Descendants("p").Skip(1).First(); //or Linq
var moreNode= HtmlNode.CreateNode("<!--more-->");
doc.DocumentNode.InsertAfter(moreNode,secondParagraph );


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é