【问题标题】:HTMLAgilityPack error: "Multiple node elements can't be created."HTMLAgilityPack 错误:“无法创建多个节点元素。”
【发布时间】: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;
}

任何人都可以建议如何使其正常工作或指出我做错了什么吗?

【问题讨论】:

    标签: c# html regex


    【解决方案1】:

    问题是HtmlTextNode.CreateNode只能创建一个节点。当你在里面添加&lt;span&gt; 时,那是另一个节点,CreateNode 会抛出你看到的异常。

    确保您只在最低的叶节点(没有子节点的节点)上进行搜索和替换。然后通过以下方式重建该节点:

    1. 创建一个新的空节点来替换旧节点
    2. .InnerText中搜索文字
    3. 使用HtmlTextNode.Create 在您要突出显示的文本之前添加纯文本
    4. 然后添加您的新&lt;span&gt;HtmlNode.CreateNode 突出显示的文本
    5. 然后搜索下一个匹配项(从 1 开始),直到找不到更多匹配项。

    【讨论】:

      【解决方案2】:

      您的函数 HighlightWords 必须返回多个顶级 HTML 节点。例如:

      <p>foo</p>
      <span>bar</span>
      

      HtmlAgilityPack 只允许返回一个顶级节点。您可以硬编码 HighlightWords 的返回值以进行测试。

      另外,this post 也遇到了同样的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多