Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
matesax
Tvůrce
Avatar
matesax:27.1.2013 19:03

Dobrý den,
celý prohlížeč mi dokonale jede - jsem krůček od vydání alfaverze. Jen se mi neadří získat text mezi párovými tagy.

public Page ParsePage (string pageHTML)
{
        Page parsed = new Page()
        {
                Forms = new List<Tag>(),
                Links = new List<Tag>(),
                Text = ""
        };

        List<Match> openTags = new List<Match>() { Regex.Match("" ,"") };

        List<Tag> closedTags = new List<Tag>() { new Tag() };

        foreach (Match m in Regex.Matches(pageHTML, "<[^<>]+>"))
        {
                Tag parsedTag = Tag.Parse(m.Value);

                if (Tag.IsTag(parsedTag.Name))
                {
                        parsedTag.Start = m.Index;

                        if (Regex.IsMatch(m.Value, @"\s*/\s*>$"))
                        {
                                parsedTag.End = m.Index + m.Length;

                                if (parsedTag.Name == "a")
                                        parsed.Links.Add(parsedTag);

                                        closedTags[closedTags.Count - 1].Childrens.Add(parsedTag);
                        }
                        else
                        {
                                if (Regex.IsMatch(m.Value, @"^\s*<\s*/"))
                                {
                                        string tagName = Regex.Match(m.Value, "[a-zA-Z1-6]+").Value;

                                        Tag tagElements;

                                        for (int index = openTags.Count - 1; index > -1; index--)
                                                if (Regex.IsMatch(openTags[index].Value, @"^\s*<\s*" + tagName))
                                                {
                                                        List<int> parts = new List<int>() { openTags[index].Index + openTags[index].Length };

                                                        tagElements = Tag.Parse(openTags[index].Value);

                                                        tagElements.End = m.Index + m.Value.Length;

                                                        for (int index2 = index; index2 < closedTags.Count; index2++)
                                                        {
                                                                parts.Add(closedTags[index2].Start);

                                                                parts.Add(closedTags[index2].End); //je 0

                                                                tagElements.Childrens.AddRange(closedTags[index2].Childrens);
                                                        }

                                                        parts.Add(m.Index);

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

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

                                                        closedTags[closedTags.Count - 1].Childrens.Add(tagElements);

                                                        switch (tagName.ToLower())
                                                        {
                                                                case "a":

                                                                        parsed.Links.Add(tagElements);

                                                                        break;

                                                                case "form":

                                                                        parsed.Forms.Add(tagElements);

                                                                        break;

                                                                default:

                                                                        for (int textIndex = 1; textIndex < parts.Count; textIndex += 2)
                                                                                parsed.Text += pageHTML.Substring(parts[textIndex - 1], parts[textIndex] - parts[textIndex - 1]);

                                                                        break;
                                                        }

                                                        break;
                                                }
                                }
                                else
                                {
                                        openTags.Add(m);
                                        closedTags.Add(parsedTag);
                                }
                        }
                }
        }

        return parsed;
}

Jak vidíte, zaznamenávám si počátek a konec tagu - konec párového tagu se dozvím při nalezení uzavíracího tagu. Tak do toho koukám a přemýšlím, proč mi z toho vyjde 0... :)

Děkuji.

 
Odpovědět
27.1.2013 19:03
Avatar
lcet.m
Člen
Avatar
lcet.m:27.1.2013 21:01

Proč se pořád bráníš tomu Html Agility Pack-u? http://htmlagilitypack.codeplex.com/ Je to hotový, poměrně dokonalý parser HTML pro .NET.

 
Nahoru Odpovědět
27.1.2013 21:01
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:27.1.2013 21:13

Pokud chceš jen odstranit html (xml) tagy. Podívej se sem: http://www.itnetwork.cz/…ace-s-textem

Nahoru Odpovědět
27.1.2013 21:13
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na lcet.m
matesax:28.1.2013 6:46

No - viděl jsem Assembly - bere normálně XML parser - a ten jede přes Regex... Tak nějak nevidím výhodu mezi přímým použitím XMLReaderu.

 
Nahoru Odpovědět
28.1.2013 6:46
Avatar
lcet.m
Člen
Avatar
Odpovídá na matesax
lcet.m:28.1.2013 9:32

Tak to bych taky rád viděl, protože tak poprasené html, které HAP dokáže správně rozparsovat, má ke XML dost daleko...

 
Nahoru Odpovědět
28.1.2013 9:32
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:28.1.2013 9:58

Zkus sem občas poslat kód programu, který se dá zobrazit bez současného rolování obrazovky a posuvníku. Tohle se nedá číst. Někdy stačí zmenšit tabulátory. Určitě bych vypustil zbytečné prázdné řádky, které máš za každým příkazem. Ovšem pokud jsi za ně placen, tak to chápu.

Metoda by neměla být delší, než na 15 řádek. Čtyřnásobné zanoření ifů promíchané s fory a switchy je také hnus, ve kterém se nedá vyznat.

Nahoru Odpovědět
28.1.2013 9:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
matesax:28.1.2013 10:36

No nic - aktuálně píši ze svého prohlížeče... :) Odpoledne (k večeru) uveřejním alfaverzi. (Nedojde-li ke komplikacím.)

 
Nahoru Odpovědět
28.1.2013 10:36
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:28.1.2013 14:20

Řádek začínající "closedTags" máš buď chybně odsazený, anebo ti tam chybí závorky.

Nahoru Odpovědět
28.1.2013 14:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:28.1.2013 14:25

Nejlepší je nechat odsazování na editoru. Chyby se pak snáze hledají a program vypadá úhledněji.

Nahoru Odpovědět
28.1.2013 14:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 9 zpráv z 9.