用HtmlAgilityPack替换HTML标记文本的内容

时间:2013-02-01 22:37:13

标签: c# html html-agility-pack markup

例如,如果我有这个标记:

<p>
    <br />
    TEXT TEXT TEXT KEYWORD
    <span>TEXT TEXT TEXT</span>
</p>

如何用一些锚元素替换KEYWORD文本,使其变为:

<p>
    <br />
    TEXT TEXT TEXT <a href="www.url.com">KEYWORD</a>
    <span>TEXT TEXT TEXT</span>
</p>

我尝试过使用HtmlNodeNavigator Value属性,它似乎只包含当前导航元素及其兄弟和子元素的文本字符(并非所有包含子元素的InnerText)。

但是当我试图使用SetValue时(因为Value只是一个getter),它会抛出一个错误,说“不支持指定的方法。”。 我真的不知道为什么会这样。
我没有找到任何其他方法来改变文本。

这是我正在运行的代码,用于在HTML标记中查找关键字文本并将其设置为链接。 我知道它还没有完成但我仍然坚持更换和获取新文本而不是旧文本。注意它是一个递归方法。

private  static void FindKeyword(string keyword, string url, HtmlAgilityPack.HtmlNodeNavigator nav)
    {
        while (!nav.IsEmptyElement && nav.InnerXml.Contains(keyword))
        {
            if (nav.Value.Contains(keyword) && nav.Name != "a")
            {
                string newStr = nav.Value.Replace(keyword, "<a href=\"" + url + "\">" + keyword + "</a>");

                nav.SetValue(newStr);//exception "Specified method is not supported"
            }

            if (nav.HasChildren)
            {
                nav.MoveToFirstChild();
                FindKeyword(keyword, url, nav); 
            }

            nav.MoveToNext();
        }
    }

有人可以帮我解决这个问题吗?
感谢

1 个答案:

答案 0 :(得分:-1)

为什么不使用Replace

string input = "<p><br />TEXT TEXT TEXT KEYWORD<span>TEXT TEXT TEXT</span></p>";
input = input.Replace("KEYWORD", "<a href=\"www.url.com">KEYWORD</a>")

如果您有多个关键字,那么

string input = "<p><br />TEXT TEXT TEXT KEYWORD<span>TEXT TEXT TEXT</span></p>";
string[] keywords = { "KEYWORD1", "KEYWORD2" };
for(int i=0; i<keywords.Length; i++)
    input.replace(keyword[i],"<a href=\"www.url.com\">" + keyword[i] + "</a");

如果你想添加不同的链接

string input = "<p><br />TEXT TEXT TEXT KEYWORD<span>TEXT TEXT TEXT</span></p>";
string[,] keyurls = { {"KEYWORD1","URL1"}, {"KEYWORD2","URL2"} };
for(int i=0; i<keyurls.GetLength(0); i++)
    input.replace(keyurls[i,0],"<a href=\"" + keyurls[i,1] + "\">" + keyurls[i,0] + "</a");