2010-06-30 188 views
0

我有一個格式適中的HTML文檔。它不是XHTML,所以它不是有效的XML。鑑於開始標籤的偏移量,我需要獲取此標籤的內容,因爲它可以在其中包含多個嵌套標籤。在C#中獲取div元素內容

用最少量的C#代碼解決這個問題的最簡單方法是什麼,它不涉及使用非標準庫?

+1

哪一個偏移您使用的?從層次結構上看,有多少個角色或多個層次? – EndangeredMassa 2010-06-30 01:40:42

+0

偏移量是字符數。文檔沒有被解析,所以沒有關於標籤及其內容的信息。 – Ghostrider 2010-06-30 02:14:09

+0

非標準的意思是: 1.你不需要任何不包含在.NET框架本身中的東西。 或 2.您不希望任何調用非託管代碼的庫。 – SamuelWarren 2010-06-30 02:35:27

回答

1

可以使用下面的函數

public static string StripHTMLTag(string strHTML) 
{ 
     return Regex.Replace(strHTML, "<(.|\n)*?>", ""); 
} 

通過你的外層標籤的內容剝去你的HTML內容,這將去除所有的HTML標籤,並提供你只有內容。

希望這有助於

Imran

+0

注意:從不使用正則表達式來實現安全性。我不確定這是否也回答OP的問題,但直到OP澄清這個問題似乎是合適的。 – 2010-06-30 01:44:11

0

我最後寫了下面的函數。它似乎爲我的目的完成了這項工作。

我知道這很髒,但大多數網頁的HTML代碼也是如此。

如果任何人都可以指出的主要缺陷,請這樣做:

private static readonly Regex rxDivTag = new Regex(
     @"<(?<close>/)?div(\s[^>]*?)?(?<selfClose>/)?>", 
     RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | RegexOptions.Singleline); 
    private const string RXCAP_DIVTAG_CLOSE = "close"; 
    private const string RXCAP_DIVTAG_SELFCLOSE = "selfClose"; 

    private static List<string> GetProductDivs(string pageText, int start) 
    { 
     bool success = true; 
     int curr = start + 1; 
     for (Match matchNextTag = rxDivTag.Match(pageText, curr) ; depth > 0 ; matchNextTag = rxDivTag.Match(pageText, curr)) 
     { 
      if (matchNextTag == Match.Empty) 
      { 
       success = false; 
       break; 
      } 

      if (matchNextTag.Groups[RXCAP_DIVTAG_CLOSE].Success) 
      { 
       if (matchNextTag.Groups[RXCAP_DIVTAG_SELFCLOSE].Success) 
       { 
        success = false; 
        break; 
       } 

       --depth; 
      } 
      else if (!matchNextTag.Groups[RXCAP_DIVTAG_SELFCLOSE].Success) 
      { 
       ++depth; 
      } 

      curr = matchNextTag.Index + matchNextTag.Length; 
     } 

     if (success) 
     { 
      return pageText.Substring(start, curr - start); 
     } 
     else 
     { 
      return null; 
     } 
    }