HtmlAgilityPack替换节点

Oma*_*mar 19 c# html-agility-pack

我想用新节点替换节点.如何获得节点的确切位置并完全替换?

我尝试了以下内容,但我无法弄清楚如何获取节点的索引或调用哪个父节点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( )
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*ado 47

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

这段代码应该适合你:

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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们需要调用ToList()查询,我们将修改文档,这样如果不这样做就会失败.


如果您希望替换为此字符串:

"some text <b>node</b> <strong>another node</strong>"
Run Code Online (Sandbox Code Playgroud)

问题是它不再是单个节点而是一系列节点.您可以使用它解析它,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);
}
Run Code Online (Sandbox Code Playgroud)