2017-06-22 3 views
0

sagt, dass ich ein HTML-Dokument wie diese:HtmlAgilityPack C# Verschachtelte divs

<!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> 

Ich versuche, es zu analysieren, mit HtmlAgilityPack einen Ersatz Regex verwenden, die für die Hervorhebung des Suchtext in einem span-Tag umschließt. So sollte die resultierende markierten Text wie folgt aussehen:

<!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> 

Das Problem ist, wenn ich Schleife durch die divs, ich Hervorhebung am Ende auf div p_456 zweimal da p_123 auch p_456 enthält. Das tatsächliche Ergebnis sieht wie folgt aus:

<!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> 

Und ich bin mit Code, der wie folgt aussieht:

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); 
} 

Gibt es eine Möglichkeit, so dass, wenn ich die Innertext von p_123 wählen es gibt mir nur die Text "MeinText hier"? Ohne das andere div? Oder gibt es einen anderen Weg, es zu tun?

Antwort

0

Sie können etwas wie unten verwenden. Ich finde die Verwendung von Regex ist nicht ideal für die Analyse 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); 
     }