nok*_*nal 8 html c# asp.net html-agility-pack
我试图替换这个神可怕的正则表达式集合,这些正则表达式目前用于清理格式不良的HTML块,并偶然发现了用于C#的HTML Agility Pack.它看起来非常强大,但是,我找不到一个如何使用包的例子,在我看来,它将是包含在其中的所需功能.我确信我是个白痴,在文档中找不到合适的方法.
让我解释一下......说我有以下html:
<p class="someclass">
<font size="3">
<font face="Times New Roman">
this is some text
<a href="somepage.html">Some link</a>
</font>
</font>
</p>
Run Code Online (Sandbox Code Playgroud)
......我想看起来像:
<p>
this is some text
<a href="somepage.html">Some link</a>
</p>
Run Code Online (Sandbox Code Playgroud)
当我使用HtmlNode.Remove()方法时,它删除节点及其所有子节点.有没有办法删除保留孩子的节点?
在HtmlNode上,RemoveChild方法有这个重载:
public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);
Run Code Online (Sandbox Code Playgroud)
所以这就是你要做的:
HtmlDocument doc = new HtmlDocument();
doc.Load("yourfile.htm");
foreach (HtmlNode font in doc.DocumentNode.SelectNodes("//font"))
{
font.ParentNode.RemoveChild(font, true);
}
Run Code Online (Sandbox Code Playgroud)
编辑:看起来像替换w/keepGrandChildren选项没有按预期工作,所以这是一个替代实现:
public static HtmlNode RemoveChild(HtmlNode parent, HtmlNode oldChild, bool keepGrandChildren)
{
if (oldChild == null)
throw new ArgumentNullException("oldChild");
if (oldChild.HasChildNodes && keepGrandChildren)
{
HtmlNode prev = oldChild.PreviousSibling;
List<HtmlNode> nodes = new List<HtmlNode>(oldChild.ChildNodes.Cast<HtmlNode>());
nodes.Sort(new StreamPositionComparer());
foreach (HtmlNode grandchild in nodes)
{
parent.InsertAfter(grandchild, prev);
}
}
parent.RemoveChild(oldChild);
return oldChild;
}
// this helper class allows to sort nodes using their position in the file.
private class StreamPositionComparer : IComparer<HtmlNode>
{
int IComparer<HtmlNode>.Compare(HtmlNode x, HtmlNode y)
{
return y.StreamPosition.CompareTo(x.StreamPosition);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3910 次 |
| 最近记录: |