2010-06-30 279 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; 
     } 
    }