我正在尝试使用HTMLAgilityPack来获取和编辑某些HTML的内部文本。我需要检查我检索到的每个节点的内部文本是否包含匹配的字符串,并突出显示那些匹配的字符串,如下所示:
var HtmlDoc = new HtmlDocument();
HtmlDoc.LoadHtml(item.Content);
var nodes = HtmlDoc.DocumentNode.SelectNodes("//div[@class='guide_subtitle_cell']/p");
foreach (HtmlNode htmlNode in nodes)
{
htmlNode.ParentNode.ReplaceChild(HtmlTextNode.CreateNode(Methods.HighlightWords(htmlNode.InnerText, searchstring)), htmlNode);
}
这是我使用的HighlightWords方法的代码:
public static string HighlightWords(string input, string searchstring)
{
if (input == null || searchstring == null)
{
return input;
}
var lowerstring = searchstring.ToLower();
var words = lowerstring.Split(' ').ToList();
for (var i = 0; i < words.Count; i++)
{
Match m = Regex.Match(input, words[i], RegexOptions.IgnoreCase);
if (m.Success)
{
string ReplaceWord = string.Format("<span class='search_highlight'>{0}</span>", m.Value);
input = Regex.Replace(input, words[i], ReplaceWord, RegexOptions.IgnoreCase);
}
}
return input;
}
有人可以建议如何使它正常工作或指出我在做什么错吗?
答案 0 :(得分:0)
问题是HtmlTextNode.CreateNode
只能创建一个节点。当您在内部添加<span>
时,这是另一个节点,并且CreateNode
会引发您看到的异常。
确保仅在最低叶节点(没有子节点的节点)上进行搜索和替换。然后通过以下方式重建该节点:
.InnerText
中的文本HtmlTextNode.Create
在要突出显示的文本之前 添加纯文本<span>
添加新的HtmlNode.CreateNode
和突出显示的文本答案 1 :(得分:0)
您的功能HighlightWords必须返回多个顶级HTML节点。例如:
<p>foo</p>
<span>bar</span>
HtmlAgilityPack仅允许返回一个顶级节点。您可以对HighlightWords的返回值进行硬编码以进行测试。
此外,this post遇到了同样的问题。