无法使用Html-Agility-Pack设置InnerText

时间:2012-07-19 14:52:38

标签: html-agility-pack

鉴于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标签,即&lt; table border ='1'&gt;标签中有1个。

2 个答案:

答案 0 :(得分:5)

以下是我为解决文本节点的 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节点的替代。

或者甚至更好,看看你能否做到像这里发布的答案: Replacing a HTML div InnerText tag using HTML Agility Pack

答案 1 :(得分:0)

在这种情况下,创建一个textnode不应该做什么:

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

结果应该是这样的 &安培; LT;脚本....

但即使我将其添加为“TEXT”而不是html,它仍然是一个有效的脚本任务。这会给我带来一些安全问题,因为文本将是来自匿名用户的输入。