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);
}
}
我有一个包含这样的字符串:
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); } }