HtmlAgilityPack删除childnode的childnode

时间:2016-01-11 13:42:09

标签: c# html-agility-pack

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

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

我需要的是过滤类似的东西:

将文字保留在P中 删除跨度和内容(字体和文本) 如果文本的直接父级不是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和他自己的删除。

我错过了什么?

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

 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,唯一真正确定的是当有一个我需要跳过他的内容和他的childNode

1 个答案:

答案 0 :(得分:1)

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

  • 您将跨度视为UpperCase,而HtmlAgilityPack将其视为LowerCase =&gt;你的if块永远不会命中
  • 你只循环p个元素(而不是p个元素的子元素)=&gt;你的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);
        }
    }