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( )
}
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);
}
Habe die folgende Lösung implementiert um das gleiche zu erreichen.
var htmlStr = "<b>bold_one</b><div class='LatestLayout'><div class='olddiv'><strong>strong</strong></div></div><b>bold_two</b>";
var htmlDoc = new HtmlDocument();
HtmlDocument document = new HtmlDocument();
document.Load(htmlStr);
htmlDoc.DocumentNode.SelectSingleNode("//div[@class='olddiv']").Remove();
htmlDoc.DocumentNode.SelectSingleNode("//div[@class='LatestLayout']").PrependChild(newChild)
htmlDoc.Save(FilePath); // FilePath .html file with full path if need to save file.
Wählen Sie also ein Objekt aus und entfernen Sie das entsprechende HTML-Objekt
und als chile anhängen. des jeweiligen Objekts.