2015-10-09 2 views
2

Я разбираю документ с помощью AngleSharp. У меня есть текстовый узел (NodeName: "#text"), и я хочу вставить в него некоторый HTML. Я могу, конечно, сбросить NodeValue во все, что захочу, но это текстовый узел, поэтому все скобки экранированы.Как вы вставляете HTML в текстовый узел в AngleSharp?

Как взять строковое значение текстового узла, вставить в него некоторый HTML-код, а затем проанализировать представление DOM, чтобы этот HTML-код заменил исходный текстовый узел?

ответ

3

Я предполагаю, что вы хотите заменить один текстовый узел несколькими узлами.

Например <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 

В зависимости от используемого варианта может быть более простое решение.

+0

Моя проблема: я пытался сделать замену на TextContent. – Deane

+0

Да, но TextContent - это просто текст (строка). Поэтому вам нужно перейти к содержащему узлу (который является «TextNode») и внести изменения в него. Могу ли я вставить некоторые помощники, чтобы сделать это более эффективно (используя методы расширения - точно так же, как и другие помощники). –

+0

Является ли это истинным утверждением: когда вы устанавливаете свойство InnerHtml для узла, он повторно анализирует и сбрасывает свои дочерние узлы? Мое тестирование показывает, что это правда. – Deane