我有一个包含这样的字符串:
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
答案 0 :(得分:1)
我在你的代码中看到了这些问题:
根据您的其他说明,这应该有效:
它会清除所有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);
}
}