gpt4 book ai didi

c# - HtmlAgilityPack 替换节点

转载 作者:IT王子 更新时间:2023-10-29 04:41:22 30 4
gpt4 key购买 nike

我想用一个新节点替换一个节点。如何获取节点的确切位置并进行完整替换?

我已经尝试了以下方法,但我无法弄清楚如何获取节点的索引或调用 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( )
}

最佳答案

要创建一个新节点,使用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);
}

关于c# - HtmlAgilityPack 替换节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6782500/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com