Diskuze: Parsování HTML

C# .NET .NET (C# a Visual Basic) Parsování HTML American English version English version

Avatar
matesax
Redaktor
Avatar
matesax:

Dobrý den,
zasekl jsem se na nějaké asi dost hloupé kravině - jak už to tak bývá... :)

List<string> openTags = new List<string>();

List<List<string>> closedTags = new List<List<string>>();

foreach (Match m in Regex.Matches(html, "<[^<>]+>"))
{
        if (!Regex.IsMatch(m.Value, @"^\s*<\s*!--.*-->$"))
        {
                if (Regex.IsMatch(m.Value, @"\s*/\s*>$"))
                        closedTags[closedTags.Count - 1].Add(m.Value);
                else
                {
                        if (Regex.IsMatch(m.Value, @"^\s*<\s*/"))
                        {
                                string tagName = Regex.Match(m.Value, "[a-zA-Z1-6]+").Value;

                                List<string> tagElements = new List<string>();

                                for (int index = openTags.Count - 1; index > -1; index--)
                                        if (Regex.IsMatch(openTags[index], @"^\s*<\s*" + tagName))
                                        {
                                                for (int index2 = index; index2 < closedTags.Count; index2++)
                                                        tagElements.AddRange(closedTags[index2]);

                                                openTags.RemoveRange(index, openTags.Count - index);

                                                closedTags.RemoveRange(index, closedTags.Count - index);

                                                closedTags[closedTags.Count - 1].AddRange(tagElements);

                                                break;
                                        }
                        }
                        else
                        {
                                openTags.Add(m.Value);
                                closedTags.Add(new List<string>());
                        }
                }
        }
}

Dokud jsem chtěl jen výpis seznamu tagů z HTML kódu, bylo to OK, nyní se snažím o zachycení vnoření - postupuji takto:

Každý jednopárový tag - uzavřený lomítkem - je automaticky přidán na vrch zásobníku.

if (Regex.IsMatch(m.Value, @"\s*/\s*>$"))
        closedTags[closedTags.Count - 1].Add(m.Value);

Každý uzavírací tag - začínající / - spustí hledání k němu pasujícího otevírajícího tagu. A tady máte důvod, proč nepoužívám Stack a kód je tak složitý - nepočítám s tím, že každému otevírajícímu tagu náleží uzavírající - jelikož od té doby, co mám zapnutou chybovou konzoli se divím, že internet ještě existuje... :)

Každému otevřenému tagu přidávám uzavřené (každý otevřený má seznam svých uzavřených), když pak zjistím, že shoda pro uzavírající tag je až 3 indexy od konce, tak vycucnu uzavřené tagy i těmto neuzavřeným - a tím je navždy pohřbím. Plánuji tyto neuzavřené tagy dávat do seznamu - a vypsat je...

Logika se zdá být OK - no ne? :) Ale párové uzavřené tagy mi to prostě nevydá - jen jednopárové uzavřené - zbytek se zdá být prázdný. Děkuji za pomoc.

 
Odpovědět 19.1.2013 7:58
Avatar
matesax
Redaktor
Avatar
matesax:

Už tady to je prázdné:

for (int index2 = index; index2 < closedTags.Count; index2++)
    tagElements.AddRange(closedTags[index2]); //výpis "closedTags[index2]" udělá prázdný řádek...
 
Nahoru Odpovědět 19.1.2013 8:04
Avatar
matesax
Redaktor
Avatar
matesax:

Samozřejmě - hovadina - nepřidal jsem počáteční a koncový tag... :)

 
Nahoru Odpovědět 19.1.2013 11:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.