3

给定一个 HTML 文档,我想识别文档中的所有数字并在数字周围添加自定义标签。现在,我使用以下内容:

HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//body");
MatchCollection numbersColl = Regex.Matches(htmlNode.InnerText, <some regex>);

一旦我得到 numbersColl,我就可以遍历每个 Match 并获取索引。但是,我无法更改 InnerText,因为它是只读的。我需要的是,如果 match.Value = 100 和 match.Index=25,我想将 25 替换为 <span isIdentified='true'> 25 </span>

对此的任何帮助将不胜感激。目前,由于我无法修改内部文本,我必须修改 InnerHtml 但某些元素的 innerHtml 中可能有 25 个。那不应该被触及。但是我如何识别数字是否在 html 标签内,即 <table border='1' > 在标签中有 1。

4

2 回答 2

6

这是我为解决Text节点的InnerText属性的只读属性限制所做的工作,只需选择 Text 节点的Parent节点,并注意父节点的子节点集合中 Text 节点的索引。然后只做一个.ReplaceChild(...)

       private void WriteText(HtmlNode node, string text)
        {
            if (node.ChildNodes.Count > 0)
            {
                node.ReplaceChild(htmlDocument.CreateTextNode(text), node.ChildNodes.First());
            }
            else
            {
                node.AppendChild(htmlDocument.CreateTextNode(text));
            }
        }

在您的情况下,我相信您需要创建一个新的 Element 节点,将文本包装到 HtmlElement 中,然后将其用作 Text 节点的替换。

或者甚至更好,看看你是否可以做类似这里发布的答案: Replaceing a HTML div InnerText tag using HTML Agility Pack

于 2012-07-31T08:59:56.813 回答
0

在这种情况下,创建一个 textnode 并不是它应该做的:

myParentNode.AppendChild(D.CreateTextNode("<script>alert('a');</script>"));
Console.Write(myParentNode.InnerHtml);

结果应该类似于 <script....

但即使我将它添加为“TEXT”而不是 html,它也是一个工作脚本任务。这对我来说是一个安全问题,因为文本将是来自匿名用户的输入。

于 2017-02-23T16:23:46.253 回答