Есть ли способ заменить узлы HTML текстовыми узлами, используя HTMLAgilityPack? - PullRequest
1 голос
/ 19 марта 2012

Я хотел бы использовать пакет HTMLAgility для замены узла в документе текстовым узлом.Целью этого является удаление тегов, окружающих сам узел.В настоящее время я делаю что-то вроде этого:

//This code fixes redundant HTML formatting tags
//This is a snippet of code
foreach (var hChildNode in hd.DocumentNode.SelectNodes("//b//b | //i//i | //u//u") ?? Enumerable.Empty<HtmlNode>())
    hChildNode.Name = "remove";
StringBuilder sb = new StringBuilder(hd.DocumentNode.WriteTo());
sb.Replace("<remove>", string.Empty);
sb.Replace("</remove>", string.Empty);

Есть ли лучший способ сделать это?Если я пытаюсь создать новый текстовый узел и затем выполнить что-то вроде приведенного ниже фрагмента кода, я получаю недопустимую ошибку приведения:

foreach (var hChildNode in hd.DocumentNode.SelectNodes("//b//b | //i//i | //u//u") ?? Enumerable.Empty<HtmlNode>())
{
    HtmlNode hNewNode = hd.CreateTextNode(hChildNode.InnerHtml);
    hChildNode.ParentNode.ReplaceChild(hNewNode, hChildNode);
}

(обновляется после того, как опечатка была указана, однако проблема все еще остается)

Я неправильно использую метод?Есть ли другой метод, который я должен использовать для выполнения подобных функций?Спасибо.

1 Ответ

4 голосов
/ 20 марта 2012

Цель этого - удалить теги, окружающие сам узел

Ваш второй отсканированный код выполняет в точности удаление тега , за исключением одной опечатки (наверное):

HtmlNode hNewNode = hd.CreateTextNode(hNewNode.InnerHtml);

Вам следует заменить hNewNode.InnerHtml на hChildNode.InnerHtml, иначе ваш код даже не скомпилируется (использование неназначенной переменной).

Также хочу отметить, что после создания текстового узла у него не будет дочерних узлов замененного (вместо этого у него будет то же значение для свойства InnerHtml с замененным узлом).

...