鉴于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个。
答案 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,它仍然是一个有效的脚本任务。这会给我带来一些安全问题,因为文本将是来自匿名用户的输入。