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
我在您的代码中看到了这些问题:
- 您将跨度视为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); } }