【问题标题】:HtmlAgilityPack - Replace Node With Another NodeHtmlAgilityPack - 用另一个节点替换节点
【发布时间】:2012-08-22 18:12:21
【问题描述】:

我有两个节点,它们的内部 HTML 如下所示:

节点1:

<p>some text</p>
<p>some more text</p>

节点2:

<p>some text</p>
<p>some more text</p>
<div><p>lots of more paragraphs here</p></div>

我正在尝试在 Node2 中查找 Node1,以便在前两段(或 Node1 中提供的任何 HTML 文本)之后添加 &lt;!--more--&gt; 标签(用于 WordPress 帖子)。

以上两个节点都有不同的父节点。在这种情况下,如何查找和替换或附加 &lt;!--more--&gt; 标签?我尝试运行以下代码,但出现错误:

代码:

node2.ParentNode.ReplaceChild(HtmlNode.CreateNode(node1.InnerHtml & "<!--more-->"), node1).InnerHtml

错误:

Node "

             " was not found in the collection
Parameter name: node

还尝试将 oldChild 部分中的 node1 更改为 HtmlNode.CreateNode(node1.InnerHtml),但这也没有用。

【问题讨论】:

    标签: c# asp.net vb.net html-agility-pack


    【解决方案1】:

    我认为直接在HtmlNode.InnerHtml 属性上执行替换会更容易:

    node2.InnerHtml = node2.InnerHtml.Replace(
        node1.InnerHtml, 
        node1.InnerHtml + "<!--more-->"
    );
    

    【讨论】:

    • 谢谢,亚历克斯。我必须添加几个级别的Trim(以消除换行符的任何前导空格),但使用Replace 就可以了。
    【解决方案2】:

    不确定为什么替换不起作用,但是您可以使用 InsertAfter 方法。

    const string html = @"<p>some text</p>
    <p>some more text</p>
    <div><p>lots of more paragraphs here</p></div>";
    var doc = new HtmlDocument();
    doc.LoadHtml(html);
    var secondParagraph = doc.DocumentNode.SelectSingleNode("//p[2]");
    // var secondParagraph = doc.DocumentNode.Descendants("p").Skip(1).First(); //or Linq
    var moreNode= HtmlNode.CreateNode("<!--more-->");
    doc.DocumentNode.InsertAfter(moreNode,secondParagraph );
    

    【讨论】:

    • 谢谢,尖叫。但这仅适用于在第二段之后插入&lt;!--more--&gt; 标签。由于 node1 和 node2 是动态的,我必须手动查找几千对来检查插入位置。
    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多