Я предполагаю, что вы хотите заменить один текстовый узел несколькими узлами.
Например <div>foo</div>
, то есть,
+ root
+ textnode
становится
+ root
+ textnode (1)
+ element
+ textnode (2)
которые могли бы <div>f<b>o</b>o</div>
. Самый простой способ, о котором я могу думать, это просто заменить узел.
var source = @"<div>foo</div>";
var parser = new HtmlParser();
var document = parser.Parse(source);
var div = document.QuerySelector("div");
div.InnerHtml = div.InnerHtml.Replace("foo", "f<b>o</b>o");
Теперь вы можете утверждать, что просто замена текста может быть не тем, что вы хотите. Возможно, у вас уже есть элементы, которые вы хотите вставить. Поэтому лучшим (еще более сложным) способом было бы разделить текстовый узел и вставить оставшееся содержимое.
var source = @"<div>foo</div>";
var parser = new HtmlParser();
var document = parser.Parse(source);
var div = document.QuerySelector("div");
var text = div.TextContent;
div.RemoveChild(div.FirstChild); // assuming there is only one child
var bold = document.CreateElement("b");
bold.TextContent = text.Substring(1, 1); //o
div.Append(
document.CreateTextNode(text.Substring(0, 1)), //f
bold,
document.CreateTextNode(text.Substring(2, 1)));//o
В зависимости от используемого варианта может быть более простое решение.
Моя проблема: я пытался сделать замену на TextContent. – Deane
Да, но TextContent - это просто текст (строка). Поэтому вам нужно перейти к содержащему узлу (который является «TextNode») и внести изменения в него. Могу ли я вставить некоторые помощники, чтобы сделать это более эффективно (используя методы расширения - точно так же, как и другие помощники). –
Является ли это истинным утверждением: когда вы устанавливаете свойство InnerHtml для узла, он повторно анализирует и сбрасывает свои дочерние узлы? Мое тестирование показывает, что это правда. – Deane