【问题标题】:What is the correct way to handle an element within an element with HTMLAgilityPack?使用 HTMLAgilityPack 处理元素中的元素的正确方法是什么?
【发布时间】:2014-12-14 18:40:08
【问题描述】:

假设我有以下 HTML

<p>Peter Piper picked a pack of <b>pickled</b> peppers</p>

我想使用 HTML Agility Pack 处理它,将每个 p 转换为 div 并将每个 b 转换为 strong。

我知道如何处理所有p标签,

foreach(var p in doc.DocumentNode.SelectNodes("//p"))
{
    var p_text = p.innerText;
    // do something with p.innerText;
}

我什至如何处理我的p 标签中的b 标签

foreach(var p in doc.DocumentNode.SelectNodes("//p"))
{
    var p_text = p.innerText;
    // do something with p.innerText;

    foreach(var b in p.Descendants().Where(x => x.Name == "b"))
    {
        // do something with b;
    }
}

但这就是我难过的地方。 p 的 innerText 和我的 b 节点集合是分开的。如何处理b 标记,以使它们保持在我的“p”节点中的正确位置?

我真的只是想从架构的角度了解如何解决这个问题

PS:抱歉,如果我的代码中有错误,我只是从记忆中做的一个例子。

【问题讨论】:

    标签: c# html html-agility-pack


    【解决方案1】:

    这应该可行:

    foreach (var p in doc.DocumentNode.SelectNodes("//p"))
    {
        p.ParentNode.ReplaceChild(
               HtmlAgilityPack.HtmlNode.CreateNode("<div>" + p.InnerHtml + "</div>"), 
               p);
    }
    
    foreach (var b in doc.DocumentNode.SelectNodes("//b"))
    {
        b.ParentNode.ReplaceChild(
                HtmlAgilityPack.HtmlNode.CreateNode("<strong>" + b.InnerHtml + "</strong>"), 
        b);
    }
    

    【讨论】:

    • 我真的没想到它会这样工作。现在看起来很明显。谢谢!
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2015-02-14
    • 2016-08-27
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多