HtmlAgilityPack ersetzt Knoten

c# html-agility-pack

Frage

Ich möchte einen Knoten durch einen neuen Knoten ersetzen. Wie kann ich die genaue Position des Knotens ermitteln und einen vollständigen Austausch durchführen?

Ich habe das folgende versucht, aber ich kann nicht herausfinden, wie man den Index des Knotens oder des Elternknotens ReplaceChild() , um 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( )
}

Akzeptierte Antwort

Verwenden HtmlNode.CreateNode() zum Erstellen eines neuen Knotens die Factory-Methode HtmlNode.CreateNode() , und verwenden Sie den Konstruktor nicht direkt.

Dieser Code sollte für Sie funktionieren:

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

Beachten Sie, dass wir ToList() für die Abfrage aufrufen ToList() , wir werden das Dokument so ToList() , dass es fehlschlägt, wenn wir dies nicht tun.


Wenn Sie diese Zeichenfolge ersetzen möchten:

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

Das Problem besteht darin, dass es sich nicht mehr um einen einzelnen Knoten, sondern um eine Reihe von Knoten handelt. Sie können es gut mit HtmlNode.CreateNode() analysieren, aber am Ende referenzieren Sie nur den ersten Knoten der Sequenz. Sie müssten den übergeordneten Knoten ersetzen.

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

Beliebte Antwort

Ich verwende HtmlDocument.DocumentNode für den neu generierten Knoten.

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



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum