使用HtmlAgilityPack处理嵌套元素

时间:2014-12-15 21:16:41

标签: c# windows-runtime html-agility-pack

所以我试图编写代码将HTML转换为Mark Store for Windows Store应用程序。到目前为止,我在HtmlAgilityPack方面取得了很大的成功,但我遇到了一个问题。

这里有一些示例HTML

<p>A paragraph of text, including some text which is <strong>bolded</strong></p>
<p>Another paragraph</p>

我使用以下代码处理此问题。

foreach (var x in doc.Descendants.Where(x => x.Name == "p").ToList())
{
    x.ParentNode.ReplaceChild(
        HtmlAgilityPack.HtmlNode.CreateNode(x.InnerHtml 
            + Environment.NewLine 
            + Environment.NewLine),
        x);
}

预期输出

A paragraph of text, including some text which is <strong>bolded</strong>

Another paragraph

但实际输出是

A paragraph of text, including some text which is 

Another paragraph

似乎只要它碰到一个嵌套节点,它就会忽略那一点之后的所有内容。

如果我之前有一个规则来处理strong标记,那么输出就是预期的。但是,我不能依靠做事#34;顺序&#34;因为那时无法在p

中处理诸如p之类的事情

我做错了什么?

注意这适用于Windows应用商店应用,并使用WinRT版本的HTMLAgilityPack 支持XPath

1 个答案:

答案 0 :(得分:0)

CreateNode方法将仅从解析的html返回第一个兄弟。这就是为什么你不会得到大胆的标签。所以你必须找到所有兄弟姐妹并将它们插回到para节点的位置并删除para节点。

此代码可以帮助您入门:

foreach (var x in doc.DocumentNode.Descendants().Where(x => x.Name == "p").ToList())
{
    var node = HtmlNode.CreateNode(x.InnerHtml + Environment.NewLine + Environment.NewLine);
    foreach (var child in node.ParentNode.ChildNodes)
    {
        x.ParentNode.InsertBefore(child, x);
    }
    x.ParentNode.RemoveChild(x);
}