2014-10-18 111 views
0

我目前正在研究如何在所选标记之外插入HTML标记。如何在所选标签之外插入HTML标签?

我在HtmlDocument上加载的是一个包含“一些”HTML标签的文本文件。它不是一个包含标签的HTML文档,而是一个带有“一些”HTML标签的文本文件。

这里的文字样本内容文件

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vel risus id velit iaculis elementum egestas vel purus. Vestibulum ante ipsum primis in <a href="http://www.domain.com">this domain</a> faucibus orci luctus et ultrices posuere cubilia Curae; In lorem enim, dignissim id congue at, malesuada vitae sem. Phasellus et nibh venenatis, vulputate elit ut, consectetur tellus. 

Sed placerat ex et dolor lobortis convallis. Nulla tincidunt elementum elementum. Integer lacinia elementum orci, ac pretium lacus hendrerit eu. Donec vitae lorem leo. Curabitur placerat sagittis nisi eu posuere. Vestibulum eget felis nisi. Nunc vitae enim iaculis, <a href="http://www.domain.com">this domain</a> maximus justo ullamcorper, imperdiet felis. Vestibulum vestibulum sapien id diam dapibus pharetra. Pellentesque varius purus justo, a vehicula lectus semper at. 

有两个A标签那里,我的XPath是为“//”正义简单。我的目标有与B上装饰的标签,U,或I输出想

<b><u><a href="http://www.domain.com">this domain</a></u></b> 

我希望HtmlNode.InsertBefore会帮助,但事情的经过是这样的

<a href="http://www.domain.com">this domain<b></b><u></u></a> 

如果使用HtmlNode.InsertAfter,它看起来像这样

<a href="http://www.domain.com"><b></b><u></u>this domain</a> 

在这两个的insertBefore和InsertAftere,它需要参考节点,有那么我只设置为null,则不参考节点

这里的示例代码

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(this.document); 

HtmlNodeCollection nodcoll = doc.DocumentNode.SelectNodes("//a"); 
if (nodcoll != null) 
{ 
    foreach (HtmlNode nod in nodcoll) 
    { 
     // nod.InsertAfter(HtmlNode.CreateNode(newhtml), null); 
     // nod.InsertBefore(HtmlNode.CreateNode(newhtml), null); 
    }   
} 

更新 我忘了说,这是格式化的标签的搜索引擎优化的偏好。如果格式是在标签之内,这将是容易得多

+0

使用jQuery通过DOM遍历是轻而易举的事:) [环绕与现有节点的 – Milkmannetje 2014-10-18 17:37:16

+0

可能重复另一个节点与敏捷包](http://stackoverflow.com/questions/11540415/surround-existing-node-with-another-node-with-agility-pack) – 2014-10-18 17:54:00

回答

1

选项A,你可以做到这一点

的一种方法是通过更换InnerHtml这样的:

var nodeList = doc.DocumentNode.SelectNodes("//a"); 
if (nodeList != null && nodeList.Count > 0) 
{ 
    foreach (var node in nodeList) 
    { 
     node.InnerHtml = "<b><u>" + node.InnerHtml + "</b></u>"; 
     // can also be written as: 
     // node.InnerHtml = node.InnerHtml.Replace(node.InnerHtml, "<b><u>" + node.InnerHtml + "</b></u>"); 
    } 
} 

上面会产生:

<a href="http://www.domain.com"><b><u>this domain</u></b></a> 

选项B

通过更换节点的另一种方法将是:

var nodeList = doc.DocumentNode.SelectNodes("//a"); 
if (nodeList != null && nodeList.Count > 0) 
{ 
    foreach (var node in nodeList) 
    { 
     // Reads the outer or you lose the link element 
     var newNodeStr = "<b><u>" + node.OuterHtml + "</b></u>"; 
     // Replace the old node with our newly created one 
     var newNode = HtmlNode.CreateNode(newNodeStr); 
     node.ParentNode.ReplaceChild(newNode, node); 
    } 
} 

上面将产生:

<b><u><a href="http://www.domain.com">this domain</a></u></b> 
+0

是的但请记住,目标是让那些格式化以外A标签。这是我们的搜索引擎优化的偏好:( – jaysonragasa 2014-10-18 17:42:23

+0

@ jaysonragasa见***选项B. *** – Prix 2014-10-18 17:50:47

+0

选项B工作!谢谢! – jaysonragasa 2014-10-18 17:54:59