HtmlAgilityPack - заменить узел другим узлом

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

Вопрос

У меня есть два узла с внутренним HTML, который выглядит примерно так:

Node1:

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

Node2:

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

Я пытаюсь найти Node1 в Node2, чтобы добавить <!--more--> (для сообщений WordPress), следуя первым двум абзацам (или любой текст HTML предоставляется в Node1).

Оба этих узла имеют разные родители. Как найти и заменить или иным образом добавить <!--more--> в таком случае? Я попытался запустить следующий код, но он ошибочно:

Код:

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

Ошибка:

Node "

             " was not found in the collection
Parameter name: node

Также попытался связать node1 в части oldChild с HtmlNode.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
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему