HtmlAgilityPack sostituisce il nodo

c# html-agility-pack

Domanda

Voglio sostituire un nodo con un nuovo nodo. Come posso ottenere l'esatta posizione del nodo e fare una sostituzione completa?

Ho provato quanto segue, ma non riesco a capire come ottenere l'indice del nodo o quale nodo genitore chiamare 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( )
}

Risposta accettata

Per creare un nuovo nodo, utilizzare il metodo factory HtmlNode.CreateNode() , non utilizzare direttamente la funzione di costruzione.

Questo codice dovrebbe funzionare per te:

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);
}

Nota che abbiamo bisogno di chiamare ToList() sulla query, modificheremo il documento in modo che fallirebbe se non lo facessimo.


Se desideri sostituire con questa stringa:

"some text <b>node</b> <strong>another node</strong>"

Il problema è che non è più un singolo nodo ma una serie di nodi. Si può analizzare bene usando HtmlNode.CreateNode() ma alla fine si fa riferimento solo al primo nodo della sequenza. Dovresti sostituire usando il nodo genitore.

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 newNodesStr = "some text <b>node</b> <strong>another node</strong>";
    var newHeadNode = HtmlNode.CreateNode(newNodesStr);
    item.ParentNode.ReplaceChild(newHeadNode.ParentNode, item);
}

Risposta popolare

Sto usando HtmlDocument.DocumentNode per il nodo appena generato.

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);
}


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché