说我有一个像这样的HTML文档:
<!DOCTYPE html>
<html>
<head>
<title>MyTest</title>
</head>
<body>
<div id="p_123">
MyText Here
<div id="p_456">
MyText Again
</div>
</div>
</body>
</html>
我尝试使用替换正则表达式使用HtmlAgilityPack解析它,该正则表达式将搜索文本包装在span标记中以突出显示。因此,生成的突出显示文本应如下所示:
<!DOCTYPE html>
<html>
<head>
<title>MyTest</title>
</head>
<body>
<div id="p_123">
<span class="highlighted">MyText</span> Here
<div id="p_456">
<span class="highlighted">MyText</span> Again
</div>
</div>
</body>
</html>
问题是,如果我遍历div,我最终会在div p_456
上突出显示两次,因为p_123
也包含p_456
。实际结果如下:
<!DOCTYPE html>
<html>
<head>
<title>MyTest</title>
</head>
<body>
<div id="p_123">
<span class="highlighted">MyText</span> Here
<div id="p_456">
<span class="highlighted"><span class="highlighted">MyText</span></span> Again
</div>
</div>
</body>
</html>
我使用的代码如下:
HtmlDocument doc = new HtmlDocument();
doc.Load(someDataStream);
foreach (HtmlNode n in doc.DocumentNode)
{
string evaluator = m => "<span class=\"highlighted\">" + m.Value + "</span>";
n.InnerText = Regex.Replace(n.InnerText, "MyText", evaluator);
}
有没有办法让我选择p_123
的InnerText时,它只返回文字&#34; MyText Here&#34;?没有其他div?或者还有另一种方法吗?
答案 0 :(得分:0)
您可以使用以下内容。我发现使用Regex并不适合解析HTML
HtmlDocument document = new HtmlDocument();
document.LoadHtml(html);
foreach(var n in document.DocumentNode.Descendants("div"))
{
var oldChild = n.FirstChild;
var newNode = document.CreateElement("span");
newNode.InnerHtml = oldChild.InnerText;
newNode.Attributes.Add("class", "highlighted");
n.ReplaceChild(newNode, oldChild);
}