Чтобы создать новый узел, используйте фабричный метод 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);
}