2017-06-22 1 views
0

Dire que j'ai un document html comme ceci:HtmlAgilityPack C# Nichée 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> 

Je suis en train de l'analyser avec HtmlAgilityPack en utilisant une expression régulière de remplacement qui enveloppe le texte de recherche dans une balise span pour mettre en évidence. Ainsi, le texte en surbrillance résultant devrait ressembler à ceci:

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

Le problème est, si la boucle I à la divs, je finis par la mise en surbrillance div p_456 deux fois parce que p_123 contient également p_456. Le résultat réel ressemble à ceci:

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

Et je suis en utilisant le code qui ressemble à ceci:

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

Est-il possible de sorte que lorsque je sélectionne le InnerText de p_123 il ne me renvoie le texte "MyText Here"? Sans l'autre div? Ou y a-t-il une autre façon de le faire?

Répondre

0

Vous pouvez utiliser quelque chose comme ci-dessous. Je trouve l'utilisation de Regex n'est pas idéal pour l'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); 
     }