Mam pewien problem z wykonaniem skryptu (głównym problemem jest brak wiedzy na temat PHP oraz JS ;]).
Mianowicie potrzebuję zrobić skrypt do pobierania informacji z pewnej strony która w źródle ma wartości xml.
Idealne byłoby gdyby zrobić skrypt który sam sobie pobiera wartości z serwera, następnie porównując je (z plikiem lub z wartościami z bazy) dodaje tylko nowe wyniki (każdy wpis na stronie ma swoją datę). Po co taka kombinacja ? Strona ta oferuje testowe softy na telefony dla developerów LG. Żeby się coś wyświetliło trzeba podać pewne argumeny. Myślę że najłatwiej będzie to wytłumaczyć na przykładzie linku :
Kod
http://csmg.lgmobile.com:9002/csmg/b2c/client/optest_rndapps_websw_list.jsp?country=PL®ion=E&buyer=POL&model=
Powyższy link jest do sprawdzenia informacji jakie softy wyszły dla kraj=Polska i sprzedawca=Polska OPEN
Natomiast ten poniżej pokazuje softy dla Niemcy, Vodafone.
Kod
http://csmg.lgmobile.com:9002/csmg/b2c/client/optest_rndapps_websw_list.jsp?country=DE®ion=E&buyer=VD2&model=
Jak łatwo dostrzec zmieniamy tylko parametry country oraz region. W systemie jest 250 krajów i zakładając że każdy kraj ma średnio 4 operatorów to daje nam 1000 stron do odwiedzania. A trzeba odwiedzać codziennie albo nawet kilka razy dziennie i ręcznie sprawdzać czy coś się zmieniło.
Jeśli wejdziemy w ten link to pojawi się nam bliżej nie zrozumiały tekst ;]. Po wejściu w źródło sytuacja staje się bardziej oczywista.
pierwszy wpis
daje nam informacje ile softów jest na stronie.
<total_count>[LICZBA]</total_count>
następnie już kolejno jest
- model telefonu
<model>[MODEL]</model>
oraz
<buyer>[ABC]</buyer>
to 3 literowy skrót sprzedawcy oraz jego pełna nazwa (buyer bo dla producenta nasz sprzedawca jest kupującym ;])
<buyer_name>[NAZWA]</buyer_name>
- wersja softu
<swversion>V99X_00</swversion>
- dokładna data kiedy plik został wrzucony na serwer
<live_date>2013-12-30 23:59:59.0</live_date>
oraz
<country>XX</country>
- kraj dla jakiego jest soft (skrót i pełna nazwa)
<country_name>Poland</country_name>
- typ procesora ( w tym przypadku Qualcomm)
<chip_type>QCT</chip_type>
oraz
<sw_uri></sw_uri>
linki do softu
<sw_locale_url></sw_locale_url>
oraz
<cdma_sw_uri></cdma_sw_uri>
linki do sterowników
<gsm_sw_uri></gsm_sw_uri>
Niektóre parametry pominąłem bo są nie ważne.
Następnie znów powtarza się ta sama procedura tylko z kolejnym modelem telefonu.
Jak wiadomo w internecie jest pełno gotowych skryptów zarówno w php jak i w js do robienia tabel, albumów i wszystkiego innego korzystając z pobierania danych z plików .xml
Tutaj znajduje się bardzo dobry przykład
Kod
http://www.w3schools.com/xml/tryit.asp?filename=tryxml_display_table
I tutaj powstają 2 problemy.
Po pierwsze w źródle ze stron których chciałbym użyć nie ma wzorowego xml, mianowicie nie występują znaczniki definiujące początek i koniec kolejnego wpisu.
W przykładzie z linku powyżej plik xml wygląda tak
Kod
http://www.w3schools.com/xml/cd_catalog.xml
i znacznikami oddzielającymi są
a pomiędzy nimi dopiero są informacje. U mnie parametry lecą jakby ciągiem i zastosowanie nawet lekko zmodyfikowanego kodu da mi tylko pierwszy wpis bo nie ma tam definicji początku i końca.
<CD></CD>
Jakoś sobie z tym poradziłem pośrednio, modyfikując na ślepo ten skrypt z przykładu tak długo aż dał mi w miarę sensowny wynik:
<!DOCTYPE html> <html> <body> <script> if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("POST","file.xml",false); xmlhttp.send(); xmlDoc=xmlhttp.responseXML; var x=xmlDoc.getElementsByTagName("*"); document.write("<table border='1'>"); for (i=0;i<x.length;i++) { document.write("<tr><td>"); document.write(x[0].getElementsByTagName("model")[i].childNodes[0].nodeValue); document.write(x[0].getElementsByTagName("suffix")[i].childNodes[0].nodeValue); document.write(x[0].getElementsByTagName("approve_date")[i].childNodes[0].nodeValue); document.write(x[0].getElementsByTagName("sw_version")[i].childNodes[0].nodeValue); document.write("_"); document.write(x[0].getElementsByTagName("cond_version")[i].childNodes[0].nodeValue); document.write(x[0].getElementsByTagName("sw_url")[i].childNodes[0].nodeValue); } document.write("</table>"); </script> </body> </html>
Skrypt działa prawie dobrze a mianowicie dalej nie jest zdefiniowany koniec ostatniego wpisu i w tabeli na końcu pod ostatnim wpisem tworzy się jeszcze jedna pusta komórka.
Kolejnym problemem jest to że jeśli ręcznie zapiszę sobie wartości z tej strony do pliku .xml na komputerze lub nawet gdzieś w sieci to wszystko się wczytuje, ale jak podam w miejsce pliku adres do strony to już niestety nic się nie wczyta.
Mogę tylko zgadywać że to może być dlatego że to nie jest plik .xml ale strona .jsp i ma tam jakieś dodatkowe konfiguracje w headerze.
Może to być spowodowane też tym że nie zaczyna się od <?xml version blablabla tylko przed tym znacznikiem jest jeszcze 0D 0A w hex powtórzone 13 razy. Tego niestety nie jestem w stanie nijak przeskorzyć z moją wiedzą.
Pisałem wcześniej na innym forum o grach w dziale rozwoju php ale tam nie było żadnego zainteresowania.
Po upływie pewnego czasu stwierdziłem że chyba można zrobić w php tak że pobieramy zawartość tej strony, następnie zamieniamy wszystkie znaczniki
na powiedzmy
<model>
oraz wszystkie
<phone><model>
na
</gsm_sw_uri>
</gsm_sw_uri></phone>
co dało by taką strukturę jaka jest w przykładzie i wtedy mógłbym spokojnie zastosować kod w js z przykładu albo jakiś prosty php.
Ostatnim problemem jest też to że właśnie pliki znikają co jakiś czas a ja chciałbym mieć bazę i trzeba by zrobić skrypt który porównuje wartości z serwera z tymi które są w pliku.xml czy w bazie mysql i dodaje do tego pliku lub do bazy nowe wartości.
Idealnie było by gdyby to mogło się dziać bez mojej ingerencji automatycznie, wtedy mógłbym to wystawić na serwer razem z innymi stronami które już zrobiłem w 100% i to pozwoliło by wszystkim użytkownikom pobierać od razu gotowe softy które będą chcieli.
Jeżeli nie da się tak zrobić to myślę że raz dziennie też znalazłbym trochę czasu żeby chwilkę poklikać, poodświeżać itp. w każdym razie wszystko jest lepsze niż robienie tego ręcznie poprzez kopiowanie wpisów do pliku.
Nie oczekuję że ktoś zrobi za mnie wszystko, da mi gotowy kod i nie będzie chciał nic w zamian ale nie ukrywam że takie rozwiązanie było by najlepsze ;d
Muszę to zrobić jak najszybciej bo to już ostatnie dni kiedy mogę tak beztrosko siedzieć przed komputerem.
Mam nadzieję że chociaż w części uda się wam mi pomóc. Z góry dziękuję.
@Edit po edycji zaawansowanej wysypują się kody xml, na szczęście miałem kopię całego tekstu i sobie poradziłem.