2012-12-14 59 views
2

我有以下的HTML元素:轉換正則表達式來htmlagilitypack

<div class="wrapper"> 
    <span class="wrapper2"> 
      <div class="myClass"> 
      MyString 
      </div> 
      <button>buttonText</button> 
    </span> 
</div> 

So, I need to convert that element to be 

≤MyString≥ free text <br> <i> <u>..... ≤MyString≥

所以,我想通了如何從HTML做轉換到我的特殊字符,但無法弄清楚如何做轉換向後轉換爲htmlAgilityPack和XPath中的html。我完全可以用正則表達式來完成,但這不是最好的解決方案。

HTML向specialChars中:

private string transformFromHtmlToMergeCodes(string text) 
      { 
       var doc = new HtmlDocument(); 
       doc.LoadHtml(text); 
       var nodes = doc.DocumentNode.SelectNodes("//div[@class='wrapper']"); 
       foreach (var item in nodes) 
       { 
        var innerText = "≤" + item.SelectSingleNode("//div[@class='myClass']").InnerText + "≥"; 
        var textNode = HtmlNode.CreateNode(innerText); 
        item.ParentNode.ReplaceChild(textNode,item); 
       } 
       return doc.DocumentNode.InnerHtml; 

      } 

從特殊字符的HTML:

private string transformFromMergeCodesToHtml(string text) 
     { 
      var matches = Regex.Matches(text, @"\«(.*?)\»"); 
      foreach (Match match in matches) 
      { 
       var innerText = match.Value 
            .Replace("≤", @"<div class=""wrapper"" contenteditable=""false""> 
                <span class=""wrapper2""> 
                <div class=""myClass"">").Replace("≥",@"</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>"); 
       text = text.Replace(match.Value, innerText); 
      } 
      return text; 
     } 

所以,它的第二個功能我想修改使用htmlAgilityPack因爲這不是最有效的方法特別是如果我有重複的節點。
我試圖找到≤MyString≥並將其轉換爲節點,但HtmlAgilityPack拋出一個錯誤,它不是一個有效的節點(這是有道理的。)任何建議?
編輯
要清楚。這是我要執行的轉換:
前:

<div class="wrapper"> 
    <span class="wrapper2"> 
      <div class="myClass"> 
      MyString 
      </div> 
      <button>buttonText</button> 
    </span> 
</div> 
free text <br> <i> <u>..... 
<div class="wrapper"> 
    <span class="wrapper2"> 
      <div class="myClass"> 
      MyString2 
      </div> 
      <button>buttonText</button> 
    </span> 
</div>  

後:

`≤MyString≥ free text <br> <i> <u>..... ≤MyString2≥` 

反之亦然

+0

您可以爲每一步添加HTML之前和之後的內容,以便我更好地理解您之後的內容... – jessehouwing

+0

+1,用於查找HtmlAgilityPack答案! – jessehouwing

回答

3

如果我理解正確的話,這可能做的伎倆。如果不是,請在之前,之間,之後,清楚地表明預期文本的樣子。

 var nodes = doc.DocumentNode.Descendants("#text").Where(text => Regex.IsMatch(text.InnerText.Trim(), @"≤[^≥]*≥")); 
     string format = 
      @"<div class=""wrapper"" contenteditable=""false""><span class=""wrapper2""><div class=""myClass"">{0}</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>"; 

     foreach (var htmlNode in nodes) 
     { 
      htmlNode.InnerHtml = string.Format(CultureInfo.InvariantCulture, format, htmlNode.InnerText.Trim().Trim(new[] { '≤', '≥' })); 
     } 

     return doc.DocumentNode.OuterHtml; 

試試這個:

private static string transformFromMergeCodesToHtml(string textWithMergeCodes) 
    { 
     HtmlDocument doc = new HtmlDocument(); 
     doc.LoadHtml(textWithMergeCodes); 

     var nodes = doc.DocumentNode.Descendants("#text").Where(text => Regex.IsMatch(text.InnerText.Trim(), @"≤[^≥]*≥")); 
     string format = 
      @"<div class=""wrapper"" contenteditable=""false""><span class=""wrapper2""><div class=""myClass"">$2</div><button type="" button"" class=""MergeCodeRemoveIcon"">×</button></span></div>"; 

     foreach (var htmlNode in nodes) 
     { 
      htmlNode.InnerHtml = Regex.Replace(htmlNode.InnerText.Trim(), @"(≤)([^≥]*)(≥)", format); 
     } 
     return doc.DocumentNode.OuterHtml; 
    } 

    private static string transformFromHtmlToMergeCodes(string text) 
    { 
     var doc = new HtmlDocument(); 
     doc.LoadHtml(text); 
     var nodes = doc.DocumentNode.SelectNodes("//div[@class='wrapper']"); 
     foreach (var item in nodes) 
     { 
      var innerText = "≤" + item.SelectSingleNode("//div[@class='myClass']").InnerText.Trim() + "≥"; 
      var textNode = HtmlNode.CreateNode(innerText); 
      item.ParentNode.ReplaceChild(textNode, item); 
     } 
     return doc.DocumentNode.InnerHtml; 

    } 

注:我更新的另一方法,以及!

+0

感謝您的回答,請參閱我的編輯。 – user194076

+0

讓我嘗試一下你的方法,雖然很快 – user194076

+0

好吧,我剛剛測試過它,並沒有像預期的那樣完成工作(我相信正則表達式有問題。) – user194076

相關問題