HtmlAgilityPack reemplazar nodo

c# html-agility-pack

Pregunta

Quiero reemplazar un nodo con un nuevo nodo. ¿Cómo puedo obtener la posición exacta del nodo y realizar una sustitución completa?

He intentado lo siguiente, pero no puedo averiguar cómo obtener el índice del nodo o a qué nodo primario llamar ReplaceChild() .

string html = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);

var bolds = document.DocumentNode.Descendants().Where(item => item.Name == "b");

foreach (var item in bolds)
{

    string newNodeHtml = GenerateNewNodeHtml();
    HtmlNode newNode = new HtmlNode(HtmlNodeType.Text, document, ?);
    item.ParentNode.ReplaceChild( )
}

Respuesta aceptada

Para crear un nuevo nodo, use el método de fábrica HtmlNode.CreateNode() , no use el constructor directamente.

Este código debería funcionar para usted:

var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodeStr = "<foo>bar</foo>";
    var newNode = HtmlNode.CreateNode(newNodeStr);
    item.ParentNode.ReplaceChild(newNode, item);
}

Tenga en cuenta que debemos llamar a ToList() en la consulta, estaremos modificando el documento para que falle si no lo hacemos.


Si desea reemplazar con esta cadena:

var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodeStr = "<foo>bar</foo>";
    var newNode = HtmlNode.CreateNode(newNodeStr);
    item.ParentNode.ReplaceChild(newNode, item);
}

El problema es que ya no es un solo nodo sino una serie de nodos. Puedes analizarlo bien usando HtmlNode.CreateNode() pero al final, solo estás haciendo referencia al primer nodo de la secuencia. Necesitará reemplazar utilizando el nodo padre.

var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodeStr = "<foo>bar</foo>";
    var newNode = HtmlNode.CreateNode(newNodeStr);
    item.ParentNode.ReplaceChild(newNode, item);
}

Respuesta popular

Estoy usando HtmlDocument.DocumentNode para el nodo recién generado.

string html = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);
var bolds = document.DocumentNode.Descendants().Where(item => item.Name == "b");
foreach (var item in bolds)
{
    string newNodeHtml = GenerateNewNodeHtml();
    var nodeDocument = new HtmlDocument();
    nodeDocument.LoadHtml(newNodeHtml);
    item.ParentNode.ReplaceChild(nodeDocument.DocumentNode);
}



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é