C# Parsowanie html

0

Mam pewien problem.
Chciałbym zrobić parsowanie formularzy zawartych w pliku html bez użycia wyrażeń regularnych.
Chodzi mi o uzyskanie zmiennej string, zawierającej <input... />, oraz <select></select> wraz z zawartością.
Z selectami udało mi się to, mam natomiast problem z inputami.
Najpierw pobieram do zmiennej formy wszystkie formularze. Potem zaś:

               do
                        {
                                a = formy.IndexOf("<input");
                                b = formy.IndexOf("/>");
                                if ((b + 9) < a) 
                                {
                                    MessageBox.Show("Błąd");
                                    goto Koniec;
                                }
                                else
                                {
                                    input = input + formy.Substring(a, ((b + 2) - a));
                                    formy = formy.Remove(0, (b + 2)); // Ponieważ przeszukiwanie zmiennej formy
 								      // przebiega od jej początku za każdym razem
 								      // usuwany jest tekst, który został dodany
								      // do input
                                }
                            
                        } while (formy1.Contains("<input"));

input to zmienna string zawierająca tekst po parsowaniu.
Problem polega na tym, że w pliku znajdują się również znaczniki <input... >(zamknięte bez prawego ukośnika).

Funkcja IndexOf() jakby ich nie widziała, poza tym ich obecność powoduje że zmienna b bywa mniejsza od zmiennej a.

To z kolei powoduje wywołanie funkcji Substring() z długością łańcucha mniejszą od zera.
Byćmoże są w Visual C# 2008 Express Edition funkcje wspomagające parsowanie html, ale za krótko w tym siedzę żeby o

tym wiedzieć.

Pomóżcie jak możecie :(

0
michals9 napisał(a)

Byćmoże są w Visual C# 2008 Express Edition funkcje wspomagające parsowanie html

VC# 2008 EE to bardzo fajne IDE, które ma bardzo wiele funkcji, np. utwórz projekt, zapisz plik, kompiluj.
Jeśli chodzi o "funkcje" wspomagające parsowanie stringów w .NET, to są nimi właśnie Regexy.
Jeśli Ci nie pasują, to możesz robić to na piechotę, za pomocą metod klasy String, tylko sam się zastanów jakie możliwe sytuacje musisz przy tym uwzględnić. Sprawdzaj argumenty metody przed jej wywołaniem, wtedy się nie wywali.

0

Użyłem wyrażeń regularnych aby pobrać tagi html i mam obecnie taki łańcuch string:

<select name="validMONTH" class="entryField"><option value="01"><option value="02"><option value="03"><option value="04"><option value="05"><option value="06"><option value="07"><option value="08"><option value="09"><option value="10"><option value="11"><option value="12"><select name="validYEAR" class="entryField"><option value="07"><option value="08"><option value="09"><option value="10"><option value="11"><option value="12"><option value="13"><option value="13"><option value="13"><option value="13"><option value="13"><option value="13"><option value="13"><option value="13"><option value="13"><option value="13"><input type="hidden" name="trans_id"
                            value="MDI6P4eMbm1eYYzaXLg478FTixc=" readonly="readonly" /><input name="trans" type="hidden" value="sto" /><input type="hidden" name="extra" value="cacao" >

Jeśli chodzi o wyrażenia regularne jestem jednak zielony.
Potrzebuję wyrażenia, za pomocą którego mogę pobrać z tego łańcucha wartości właściwości name i value.
Muszę to skończyć do jutra, więc byłbym niezmiernie wdzięczny za jakąś podpowiedz.

0

na piechote uzywajac string, nie jest to az tak trudne

        private void button2_Click(object sender, EventArgs e)
        {
            string wartosci="";
            string html = textBox1.Text; // ten tekst co wyslales
            for (int i = 0; i < html.Length - 10; i++)
            {
                if (html.Substring(i, 4) == "name")
                {
                    char tempchar; 
                    do
                    {
                        tempchar = html[i++ + 6];
                        if (tempchar != '"')
                        {
                            wartosci += tempchar;
                        }
                        if (tempchar == '"') wartosci += " ";
                    } while (tempchar != '"');                    
                }
            }
            MessageBox.Show("" + wartosci); // dostajesz wszystkie wartosci name 
        }

kod byle jaki, do popraw, ale chodzi o idee.
to tylko przyklad, dla value zrobisz podobnie tylko strzez w jakis sposob aby petla while nie wyszła poza zakres elementow ciagu html.

1 użytkowników online, w tym zalogowanych: 0, gości: 1