HTMLAgilityPack 错误:“无法创建多个节点元素。”
Posted
技术标签:
【中文标题】HTMLAgilityPack 错误:“无法创建多个节点元素。”【英文标题】:HTMLAgilityPack error: "Multiple node elements can't be created." 【发布时间】:2019-04-19 18:03:56 【问题描述】:我正在尝试使用 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;
任何人都可以建议如何使其正常工作或指出我做错了什么吗?
【问题讨论】:
【参考方案1】:问题是HtmlTextNode.CreateNode
只能创建一个节点。当你在里面添加<span>
时,那是另一个节点,CreateNode
会抛出你看到的异常。
确保您只在最低的叶节点(没有子节点的节点)上进行搜索和替换。然后通过以下方式重建该节点:
-
创建一个新的空节点来替换旧节点
在
.InnerText
中搜索文字
使用HtmlTextNode.Create
在您要突出显示的文本之前添加纯文本
然后添加您的新<span>
与HtmlNode.CreateNode
突出显示的文本
然后搜索下一个匹配项(从 1 开始),直到找不到更多匹配项。
【讨论】:
【参考方案2】:您的函数 HighlightWords 必须返回多个*** HTML 节点。例如:
<p>foo</p>
<span>bar</span>
HtmlAgilityPack 只允许返回一个***节点。您可以硬编码 HighlightWords 的返回值以进行测试。
另外,this post 也遇到了同样的问题。
【讨论】:
以上是关于HTMLAgilityPack 错误:“无法创建多个节点元素。”的主要内容,如果未能解决你的问题,请参考以下文章
HTMLAgilityPack 错误:“无法创建多个节点元素。”
如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误