2012-08-22 40 views
0

我有有内部HTML两个节点即是这样的:HtmlAgilityPack - 更换节点与另一个节点

节点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文本)之后添加<!--more-->标签(用于WordPress帖子)。

以上两节点都有不同的父节点。在这种情况下,我如何找到并替换或附加<!--more-->标签?我试图运行下面的代码,但它的错误了:

代码:

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

错误:

Node " 

      " was not found in the collection 
Parameter name: node 

还试图在oldChild所部分换款node1HtmlNode.CreateNode(node1.InnerHtml)但没有奏效无论是。

回答

2

我认为这将是更容易直接HtmlNode.InnerHtml物业进行更换:

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

谢谢,亚历克斯。我不得不添加一些'Trim'(为了摆脱换行符的所有前导空格),但是使用'Replace'取代了它。 – Zishan

0

不知道为什么更换不起作用,但有一个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); 
+0

谢谢,尖叫。但是这只适用于在第二段之后插入''标签。由于node1和node2是动态的,我必须手动查找几千对以检查插入的位置。 – Zishan

相关问题