HtmlAgilityPack 删除子节点的子节点

HtmlAgilityPack remove childnode of childnode

我有一个包含这样的字符串:

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

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

将文本保留在 P 内 删除 Span 和内容(字体和文本) 如果 Text 的直接父级不是 Span*

,则将 Text 保留在字体内

我有的是:

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。

我错过了什么?

注意 : 在另一个 post 上有人告诉我 :

 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);
        }

但是我不明白所有的语法所以我想重写我自己的尝试,而且它也没有一直工作,它仍然在 Span 中获取 Font 中的文本。

注 2 我找不到关于 Agilty Pack 规格的任何文档。如果有人知道在哪里可以找到它,我想了解更多关于这个库的信息。

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

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

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

根据您的补充说明,这应该有效:

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

    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);
        }
    }