2010-06-30 5 views
0

J'ai un document HTML modérément bien formaté. Ce n'est pas du XHTML donc ce n'est pas du XML valide. Compte tenu d'un décalage de la balise d'ouverture, j'ai besoin d'obtenir le contenu de cette balise, sachant qu'elle peut contenir plusieurs balises imbriquées.Récupère le contenu de l'élément div en C#

Quelle est la manière la plus simple de résoudre ce problème avec un minimum de code C# qui n'implique pas l'utilisation de bibliothèques non standard?

+1

Qu'est-ce que OFFSET utilisez-vous? C'est un nombre de caractères ou un nombre de niveaux à descendre dans la hiérarchie? – EndangeredMassa

+0

Le décalage correspond au nombre de caractères. Le document n'est pas analysé, il n'y a donc pas d'informations sur les balises et leur contenu interne. – Ghostrider

+0

Est-ce que non standard signifie: 1. Vous ne voulez rien qui ne soit pas inclus dans le cadre .NET lui-même. OU 2. Vous ne voulez pas de bibliothèques qui effectuent des appels au code non managé. – SamuelWarren

Répondre

1

Vous pouvez enlever votre contenu HTML en utilisant la fonction suivante

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

passer votre contenu de l'étiquette extérieure, ce dépouillera toutes les balises HTML et vous fournir uniquement le contenu.

Hope this helps

Imran

+0

Note: n'utilisez jamais regex pour la sécurité. Je ne suis pas sûr que cela réponde non plus à la question du PO, mais jusqu'à ce que le PO clarifie la question, cela semble approprié. –

0

Je fini par écrire la fonction suivante. Il semble faire le travail pour mes fins. Je sais que c'est un peu sale, mais le code HTML de la plupart des pages Web l'est aussi.

Si quelqu'un peut signaler les défauts principaux, s'il vous plaît faire:

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; 
     } 
    } 
Questions connexes