2017-06-22 21 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を強調表示するspanタグで検索テキストをラップ置換正規表現を使用してそれを解析しようとしています。だから、結果の強調表示されたテキストは、次のようになりますdivを通じIループは、私はp_123p_456が含まれているため、二回のdiv 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">MyText</span> Again 
     </div> 
    </div> 
</body> 
</html> 

問題は、あります。私はp_123のInnerTextプロパティを選択した場合、それは私だけ返すような方法があります

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

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

そして、私はこのようなコードを使用しています:実際の結果はこのようになりますテキスト "MyText Here"?他の部門がなければ?それとももう一つの方法がありますか?

答えて

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); 
     } 
関連する問題