Не удалось установить InnerText с помощью Html-Agility-Pack

html-agility-pack

Вопрос

Учитывая HTML-документ, я хочу идентифицировать все числа в документе и добавлять собственные теги вокруг чисел. Сейчас я использую следующее:

HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//body");
MatchCollection numbersColl = Regex.Matches(htmlNode.InnerText, <some regex>);

Как только я получу numberColl, я могу пройти через каждое совпадение и получить индекс. Однако я не могу изменить InnerText, поскольку он доступен только для чтения. Мне нужно то, что если match.Value = 100 и match.Index = 25, я хочу заменить это 25 на <span isIdentified='true'> 25 </span>

Любая помощь в этом будет принята с благодарностью. В настоящее время, так как я не могу изменить внутренний текст, мне нужно изменить InnerHtml, но у какого-то элемента может быть 25 в его innerHtml. Это не следует трогать. Но как определить, находится ли число в теге html, т.е. <table border = '1'> имеет 1 в теге.

Принятый ответ

Вот что я сделал, чтобы обойти ограничение свойств только для чтения свойства InnerText узла Text , просто выберите родительский узел узла Text и обратите внимание на индекс узла Text в коллекциях дочерних узлов родительского узла. Затем просто ReplaceChild(...) .

       private void WriteText(HtmlNode node, string text)
        {
            if (node.ChildNodes.Count > 0)
            {
                node.ReplaceChild(htmlDocument.CreateTextNode(text), node.ChildNodes.First());
            }
            else
            {
                node.AppendChild(htmlDocument.CreateTextNode(text));
            }
        }

В вашем случае я считаю, что вам нужно создать новый элемент Element, который обертывает текст в HtmlElement, а затем просто использует его в качестве замены узла Text.

Или еще лучше, посмотрите, можете ли вы сделать что-то вроде ответа, размещенного здесь: Замена тега HTML-тега InnerText с использованием пакета Agility Pack


Популярные ответы

создание текстового блока не делает этого в этом случае:

myParentNode.AppendChild(D.CreateTextNode("<script>alert('a');</script>"));
Console.Write(myParentNode.InnerHtml);

Результат должен быть чем-то вроде & lt; script ....

но это работающий скрипт, даже если я добавлю его как «ТЕКСТ» не как html. Это вызывает у меня проблему безопасности, потому что текст будет входом от анонимного пользователя.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему