2017-06-22 58 views
0

說我有一個html文件是這樣的:HtmlAgilityPack C#嵌套的div

<!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更換正則表達式,它包裝在突出的跨度標籤搜索文本解析它。因此,所產生的高亮文本應該是這樣的:

<!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它只返回我文本「MyText Here」?沒有其他的div?還是有另一種方法來做到這一點?

回答

0

你可以使用下面的東西。我發現使用正則表達式不理想的解析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); 
     }