Witam,
Planuję napisać aplikację, która będzie wyświetlać plan lekcji każdego nauczyciela lub klasy wymienionych na stronie z planem. Program ma wczytywać wartości ze strony www, pobierać tylko sam tekst i wklejać wartości do nowo utworzonej tabeli. Zamierzam pisać ten program w WPF.
Myślę, iż doradzicie, jakich funkcji powinienem użyć lub podać przykładowy kod.
strona niech wypluwa xml, czytanie ze strony w c# jest banalne łatwo znajdziesz, a odczyt xml trochę trudniejszy ale też znajdziesz, a wczytać do tabelki, yyyy no comment.
Mi się wydaje że odczyt xml/json jest łatwiejszy niż wyciąganie tabeli ze strony.
Moje pierwsze pytanie brzmi: w czym jest pisana strona? I czy masz możliwość zmieniać jej kod/zlecać zmiany twórcy?
Strona była pisana w HTML-u + JavaScript;
na chwilę obecną nie mam możliwości zmieniania kodu strony.
EDIT:
Wygląda ona następująco: jest strona .../plan , na której znajdują się pod strony z klasami, nauczycielami oraz z salami.
Plan lekcji dla danej klasy jest na podstronach: http://przykład.com/plan/plany/o1.html - pierwsza klasa, http://przykład.com/plan/plany/o2.html - druga klasa itd.
Nauczyciele są ustawieni na podstronach: http://przykład.com/plan/plany/n1.html -> n2.html -> itd.
Dana podstrona ma mniej więcej taką konstrukcję:
<table border="0" cellpadding="10" cellspacing="0">
<tr><td colspan="2">
<table border="1" cellspacing="0" cellpadding="4" class="tabela">
<tr>
<th>Nr</th>
<th>Godz</th>
<th>Poniedziałek</th>
<th>Wtorek</th>
<th>Środa</th>
<th>Czwartek</th>
<th>Piątek</th>
</tr>
<tr>
<td class="nr">0</td>
<td class="g"> 7:05- 7:50</td>
<td class="l"> </td>
<td class="l"> </td>
<td class="l"> </td>
<td class="l"> </td>
<td class="l"> </td>
</tr>
<tr>
<td class="nr">1</td>
<td class="g"> 8:00- 8:45</td>
<td class="l"> </td>
<td class="l"> </td>
<td class="l"><a href="o4.html" class="o">1D</a> <span class="p">matematyka</span> <a href="s2.html" class="s">105</a><br></td>
<td class="l"> </td>
<td class="l"><a href="o5.html" class="o">1E</a> <span class="p">matematyka</span> <a href="s2.html" class="s">105</a><br></td>
</tr>
No to niestety będziesz się musiał bawić w ręczne parsowanie strony (pewnie przy pomocy Regexów). Nie jest to strasznie trudna robota ale jednak. Mam jeszcze pytanie czy masz czas na naukę przy okazji pisania tego projektu i chcesz poznać dobre praktyki czy chcesz złożyć klasy byle jak na kupę aby działało?
Ja chciałbym zapytać kim jest użytkownik docelowy i ilu ich będzie? Ile masz czasu na naukę i przygotowanie tego ?
Moim zdaniem było by Ci o 100000 razy lepiej napisać całość w asp.net mvc, wsadzić wszystko do bazy danych itd. Tak, wiem że to brzmi jak kosmos może czy coś, ale tak nie jest, jest to naprawdę świetne rozwiązanie moim zdaniem i wiem że będzie skalowalne (będziesz chciał mieć później 1000 klas i nauczycieli - no problem :) ). Jeżeli chcesz żeby Ci z tym pomóc to możesz nawet na priv się odezwać.
@ne0 zakładam że plan jest generowany przez oprogramowanie za które szkoła wywaliła ciężkie pieniądze. A projekt ma wyświetlić ten sam plan a nie tworzyć program do układania planów na nowo.
Czasu nie mam zbyt dużo, bo do 11.06, czyli 10 dni.
Plan jest generowany przez firmę Vulcan.
Program ma być kierowany do przeciętnego ucznia, który szuka nauczyciela i chciałby się dowiedzieć, gdzie będzie miał on lekcje. Wiecie, nie chodzi mi o to, żeby działało dobrze, chodzi mi tylko o to by było takie coś.
Mam jeszcze jedno pytanie do Was: czy trudno byłoby w zaistniałej sytuacji napisać ten program na Windows Phone? Bo widziałem, że C# obsługuje programowanie na ten system.
Liczę na wsparcie ;) mimo tak trudniej sytuacji.
Jeżeli zrobisz to przy pomocy klas Regex i WebClient(ewentualnie HttpClient) to zarówno napisanie na Windows Phone jak i w WPF zajmie tyle samo czasu (tyle że WPF na małą skalę łatwiej się dystrybuuje i Debuguje na dużą skalę łatwiej jest z Windows Phone - masz MarketPlace).
Możliwe że ten soft ma jakieś API jednak jest to mało prawdopodobne - zawsze można zadać pytanie producentowi.
Znalazłem taki o to kod:
using (WebClient client = new WebClient())
{
string content = client.DownloadString("http://www.zse.bydgoszcz.pl/plan/plany/n1.html");
string text = Regex.Match(content, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>", RegexOptions.IgnoreCase).Groups["Title"].Value;
Console.WriteLine(text);
}
Działa jak na razie w oknie konsolowym, rzeczywiście pobiera dane z kodu źródłowego podstrony.
Nie wiem tylko, jak to w XAML-u umieścić do tabeli, czy znacie może jakiś komponent, dzięki któremu mógłbym to zrobić?
I jeszcze jedno pytanie: Znacie jakąś dobrą stronę, tłumaczącą wyrażenia regularne funkcji Regex - czyli szukanie w kodzie HTML?
Poczytaj o databindingu i wzorcu MVVM, można bez tego ale znając to podejście pisze łatwiejszy w interpretacji kod.
http://htmlagilitypack.codeplex.com/ -> w miare lekkie i przyjemne z dobra dokumentacja i przykaladami