HtmlAgilityPack替换节点

本文关键字:节点 替换 HtmlAgilityPack | 更新日期: 2023-09-27 18:02:57

我想用一个新节点替换一个节点。我怎样才能得到节点的确切位置并进行完全替换呢?

我尝试了以下方法,但我不知道如何获得节点的索引或在哪个父节点上调用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( )
}

HtmlAgilityPack替换节点

要创建新节点,请使用HtmlNode.CreateNode()工厂方法,不要直接使用构造函数。

这段代码应该可以为你工作:

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

请注意,我们需要在查询中调用ToList(),我们将修改文档,因此如果我们不这样做,它将失败。


如果你想用这个字符串替换:

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

问题是它不再是单个节点,而是一系列节点。您可以使用HtmlNode.CreateNode()很好地解析它,但最后,您只引用序列的第一个节点。您需要使用父节点进行替换。

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

已实现以下解决方案以达到相同的效果。

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.

选择一个对象并删除相应的HTML对象

并追加为智利。