如何在所选标记之外插入HTML标记?

时间:2014-10-18 17:28:23

标签: c# html html-agility-pack

我目前正在查询如何在所选标签之外插入HTML标签。

我在HtmlDocument上加载的是一个文本文件,其中包含" some" HTML标签。它不是包含标记的HTML文档,但它是一个文本文件,其中包含#34;某些" 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就像&#34; // a&#34;一样简单。我的目标是用B,U或I装饰A标签。输出想要

<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);
    }           
}

更新 我忘了提到这是SEO对格式化A标签的偏好。如果格式化在A标签内部,则会更容易

1 个答案:

答案 0 :(得分: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>