将 HTML 标记文本的内容替换为 HtmlAgilityPack

本文关键字:替换 HtmlAgilityPack HTML 文本 | 更新日期: 2023-09-27 17:56:59

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

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

如何将关键字文本替换为一些锚元素,使其变为:

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

我尝试使用 HtmlNodeNavigator 值属性,它似乎只有当前导航元素及其兄弟姐妹和子元素的文本字符(不是所有包含子元素的 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();
        }
    }

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

将 HTML 标记文本的内容替换为 HtmlAgilityPack

为什么不直接使用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");