HtmlAgilityPack - 用另一個節點替換節點

asp.net c# html-agility-pack vb.net

我有兩個內部HTML的節點,如下所示:

節點1:

<p>some text</p>
<p>some more text</p>

節點2:

<p>some text</p>
<p>some more text</p>
<div><p>lots of more paragraphs here</p></div>

我試圖在Node2中查找Node1,以便在前兩段(或Node1中提供的任何HTML文本)之後添加<!--more-->標籤(對於WordPress帖子)。

上述兩個節點都有不同的父節點。在這種情況下,如何找到並替換或以其他方式附加<!--more-->標籤?我嘗試運行以下代碼,但它出錯了:

碼:

node2.ParentNode.ReplaceChild(HtmlNode.CreateNode(node1.InnerHtml & "<!--more-->"), node1).InnerHtml

錯誤:

Node "

             " was not found in the collection
Parameter name: node

還嘗試將oldChild部分中的node1HtmlNode.CreateNode(node1.InnerHtml)但這也不起作用。

一般承認的答案

我認為直接在HtmlNode.InnerHtml屬性上執行替換會更容易:

node2.InnerHtml = node2.InnerHtml.Replace(
    node1.InnerHtml, 
    node1.InnerHtml + "<!--more-->"
);

熱門答案

不知道為什麼替換不起作用,但是你可以使用InsertAfter方法。

const string html = @"<p>some text</p>
<p>some more text</p>
<div><p>lots of more paragraphs here</p></div>";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var secondParagraph = doc.DocumentNode.SelectSingleNode("//p[2]");
// var secondParagraph = doc.DocumentNode.Descendants("p").Skip(1).First(); //or Linq
var moreNode= HtmlNode.CreateNode("<!--more-->");
doc.DocumentNode.InsertAfter(moreNode,secondParagraph );


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因