首页 文章

如何用string.Empty [duplicate]替换Html Comment <! - comment - >标签

提问于
浏览
1

这个问题在这里已有答案:

我试图从我的htmlNode中删除所有Html注释标记,以下是我的c#中的HtmlNode选择代码

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”的返回值 .

任何帮助都会有很大的帮助 .

2 回答

  • 0

    已回答here

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

    注意:ToList是必需的,因为您无法更改要枚举的序列 .

  • 0

    感谢大家的帮助 . 我找到了以下功能的解决方案 .

    在填充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();
    }
    

    供参考:我在下面的帖子中找到了答案 . How to select node types which are HtmlNodeType Comment using HTMLAgilityPack

    非常精确,有许多不同的例子类型,正是我所追求的 .

相关问题