Как заменить HTML-комментарий теги с string.Empty

c# html html-agility-pack

Вопрос

Я пытаюсь удалить все теги комментариев Html из моего htmlNode, Ниже приведен код выбора HtmlNode из моего c #

HtmlNode table = doc5.DocumentNode.SelectSingleNode("//div[@id='div12']");

возвращенный псевдо-код разметки HtmlNode ниже

<table>
  <tr>
    <td>test</td>
    <td>
      <!-- <a href='url removed' >Test link Test 2 Comment </a> -->
    </td>
  </tr>
</table>​

Мне удалось настроить регулярное выражение для решения моей проблемы, код c # выглядит следующим образом. Но только в моем тестовом прогоне он успешно работал и с типом ввода в виде строки. См. Ниже код c #.

string rkr;
rkr = "<!-- <a href='url removed' >Test link Test 2 Comment </a> -->";
rkr = Regex.Replace(rkr, @"(\<!--\s*.*?((--\>)|$))",String.Empty);

Результат = "". это то, что я хочу в реальном времени для всех тегов.

Я видел много примеров кода на форумах и форуме stackoverflow. но ничто не близко к тому, что я хочу. одно сообщение было действительно полезно, но это было для php - поэтому снова бесполезно.

Теперь, если в приведенной выше функции Regex.Replace введите

rkr = Regex.Replace(table, @"(\<!--\s*.*?((--\>)|$))",String.Empty);

Я получаю следующую ошибку

Наилучшее перегруженное соответствие метода для 'System.Text.RegularExpressions.Regex.Replace (string, System.Text.RegularExpressions.MatchEvaluator, int)' имеет некоторые недопустимые аргументы

Я также пытался конвертировать

rkr = Regex.Replace(table.ToString(), @"(\<!--\s*.*?((--\>)|$))",String.Empty);

Но тогда я получаю возвращаемое значение rkr = "HtmlAgilityPack.HtmlNode".

Любая помощь будет большой помощью.

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

Спасибо за вашу помощь. Я нашел решение в следующей функции.

Просто вызывается функция после заполнения doc5 следующим образом

HtmlNode table = doc5.DocumentNode.SelectSingleNode("//div[@id='div12']");

RemoveComments(table);

public static void RemoveComments(HtmlNode node)
{
    foreach (var n in node.ChildNodes.ToArray())
        RemoveComments(n);
    if (node.NodeType == HtmlNodeType.Comment)
        node.Remove();
}

Для справки: я нашел ответ в следующем сообщении. Как выбрать типы узлов, которые являются комментарием HtmlNodeType, используя HTMLAgilityPack

очень точный и со многими различными типами примеров, именно то, что я был после.


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

Ответил здесь :

doc5.DocumentNode.Descendants()
    .Where(n => n.NodeType == HtmlAgilityPack.HtmlNodeType.Comment)
    .ToList()
    .ForEach(n => n.Remove());

Примечание. ToList необходим, потому что вы не можете изменить последовательность, которую вы перечисляете.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow