HtmlAgilityPack删除子节点的子节点

本文关键字:子节点 删除 HtmlAgilityPack | 更新日期: 2023-09-27 18:29:45

我有一个字符串,其中包含以下内容:

string text = "<p>test <span> <font> here </font> </span> try</p><p> <font> try 2</font> </p>"

我需要的是过滤这样的东西:

将文本保持在p内删除范围和内容(字体和文本)如果直接父级不是Span*,则将文本保留在字体内

我拥有的是:

StringBuilder sbtexttoCorrect = new StringBuilder();
HtmlDocument html = new HtmlDocument();
html.LoadHtml(textToFormat);
var nodes = html.DocumentNode.SelectNodes("//p");
foreach (var line in nodes)
{
   if (line.Name =="SPAN")
   {
      line.RemoveAllChildren();
      line.Remove();
   }
}
foreach (var txt in nodes)
{
sbtexttoCorrect.Append(txt.InnerText);
}

但是末尾的sbtexttoCorrect仍然获得span的子字体。即使使用Removechild和他自己的Remove。

我错过了什么?

注意:在另一篇帖子中,有人告诉我:

 foreach (var line in nodes.Select(node => node.ChildNodes.Where(
     childNode => childNode.Name != "span"))
                    .Select(
                        textNodes => textNodes.Aggregate(String.Empty, (current, node) => current + node.InnerText)))
        {
            sbtexttoCorrect.Append(line);
        }

但我不理解所有的语法,所以我想重写我自己的尝试,加上它也一直不起作用,它仍然将文本放在跨度内的字体内。

注意2我找不到任何关于敏捷包规范的文档。如果有人知道在哪里可以找到它,我想了解更多关于这个图书馆的信息。

编辑真正的HTML要复杂得多,有很多我不知道sur的childNode,它们可以是TD或DIV,唯一真正确定的是当有一个跨度时,我需要跳过他的内容和他的childNode

HtmlAgilityPack删除子节点的子节点

我在您的代码中看到了这些问题:

  • 您将跨度视为UpperCase,而HtmlAgilityPack将其处理为LowerCase=>您的if块永远不会命中
  • 您只在p元素上循环(而不是在p元素的子元素上)=>您的if块永远不会命中

根据您的其他解释,这应该有效:

  • 它使用XPath选择所有跨度(因此应该适用于大写和小写)
  • 它删除跨度
  • 它清除所有html元素(如这里所示)

    string text = "<p>test <SPAN> <font> here </font> </SPAN> try</p><p><table> <tr><td><span>test</span></td></tr></table><font> try 2</font> </p>";
    StringBuilder sbtexttoCorrect = new StringBuilder();
    HtmlDocument html = new HtmlDocument();
    html.LoadHtml(text);
    var nodes = html.DocumentNode.SelectNodes("//span");
    foreach (var node in nodes)
    {
        node.Remove();
    }
    foreach (var node in html.DocumentNode.DescendantsAndSelf())
    {
        if (!node.HasChildNodes)
        {
            string t = node.InnerText;
            if (!string.IsNullOrEmpty(t))
                sbtexttoCorrect.AppendLine(t);
        }
    }