[advAJAX][XML] Problem z parsowaniem XML |
[advAJAX][XML] Problem z parsowaniem XML |
2.05.2006, 20:08:23
Post
#1
|
|
Grupa: Zablokowani Postów: 167 Pomógł: 2 Dołączył: 15.02.2004 Ostrzeżenie: (30%) |
Czy moglibyście zerknąć dlaczego funkcja xml2array napisana w JavaScript nie działa pod Internet Explorer i Operę? Działa tylko pod Fire Foxem. Jest ona odpowiedzialna za proste sparsowanie XML-a, który trafia do funkcji biblioteki advAjax.
Kod function godzina() { advAJAX.get({ url: 'ajax.php', onSuccess: function(obj) { var result = xml2array(obj.responseXML); document.getElementById('godzina').innerHTML = result["godzina"]; window.setTimeout('godzina()', 1000); }, }); } function xml2array(xml) { var result = new Array(); var key = null; var value = null; for (var i = 0; i < xml.childNodes.length; i++) { key = xml.getElementsByTagName("name")[i].getAttribute("id"); value = xml.getElementsByTagName("name")[0].firstChild.nodeValue; result[key] = value; } return result; } godzina(); Dane w formacie XML: Kod <data> <name id="godzina">17:00</name> </data> Proszę o pomoc i rozwiązanie problemu z funkcją xml2array. |
|
|
3.05.2006, 12:20:28
Post
#2
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%) |
Podaj najprostszy możliwie przykład, który nie korzysta z zewnętrznych bibliotek, bo tak trudno cos powiedzieć. Może w advAJAX'ie, cos nie zaskakuje.
|
|
|
4.05.2006, 08:18:17
Post
#3
|
|
Grupa: Zablokowani Postów: 167 Pomógł: 2 Dołączył: 15.02.2004 Ostrzeżenie: (30%) |
Cytat(mariuszn3 @ 2006-05-03 13:20:28) Podaj najprostszy możliwie przykład, który nie korzysta z zewnętrznych bibliotek, bo tak trudno cos powiedzieć. Może w advAJAX'ie, cos nie zaskakuje. To jest najprostrza postać kodu. Nie wiem czy wina leży w funkcji advAjaxowej czy po stronie parsowania xml-a. Proszę o pomoc bardziej doświadczonych webmajsterów. |
|
|
4.05.2006, 08:24:37
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) |
FF bardzo po 'macoszemu' traktuje pliki XML, nie zwraca uwagi na drobne błędy, za to IE (na którego wszyscy narzekają) nie toleruje błędów:
to nie jest do końca poprawny kod XML: Kod data> <name id="godzina">17:00</name> </data> daj na początku np: Kod <?xml version="1.0" encoding="UTF-8"?> a dotego jeśli genrujesz pliki przy pomocy php musisz dać:
-------------------- |
|
|
4.05.2006, 11:04:58
Post
#5
|
|
Grupa: Zablokowani Postów: 46 Pomógł: 0 Dołączył: 12.01.2006 Ostrzeżenie: (10%) |
Cytat(TomASS @ 2006-05-04 07:24:37) FF bardzo po 'macoszemu' traktuje pliki XML, nie zwraca uwagi na drobne błędy, za to IE (na którego wszyscy narzekają) nie toleruje błędów: to nie jest do końca poprawny kod XML: Kod data> <name id="godzina">17:00</name> </data> daj na początku np: Kod <?xml version="1.0" encoding="UTF-8"?> a dotego jeśli genrujesz pliki przy pomocy php musisz dać:
TomASS, to oczywiste, co podałeś. Mam to rozrgrane w php, które znam dobrze. Problem leży po stronie JavaScript i dlatego nie publikowałem mojego kodu php. |
|
|
4.05.2006, 13:29:16
Post
#6
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%) |
=> eMartio
Pownieneś dopisać w jaki sposób objawia się nie działanie w IE? Wywala błąd? Wyrzuca nie oczekiwane dane? Nic nie wyrzuca i nie ma błędu? Napisałem o możliwie najprostszym kodzie, bo nie każdy używając ajax'a korzysta z biblioteki advAjax. Nie mniej po przyjrzeniu się, zakładając, że advAjax przekazuje wszystko poprawnie faktycznie nie potrzeba tego upraszczać. Pierwsza rzecz, którą widzę - nie ważne ile elementów 'data' obok siebie będziesz miał w XML'u w IE pętla for przejdzie tylko raz. Po prostu IE ma trochę inaczej zaimplementowany responseXML. W IE pierwszym i ostatnim dzieckiem responseXML jest zawsze element 'xml' i dopiero on zawiera strukturę, którą przekazałeś. W FF (i podejrzewam innych) Twoja struktura jest bezpośrednio w responseXML. Druga rzecz.. to nie bardzo rozumiem, czemu w pętli for druga linia odwołuje się do elementu 'name' pod indeksem 0: Kod value = xml.getElementsByTagName("name")[0].firstChild.nodeValue; Chyba tam powinna być zmienna 'i' zamiast 0. Trzecia rzecz, która być może właśnie sprawia, że w IE kod nie chodzi to kwestia pisowni nazw atrybutów. Nie jestem pewiem czy IE podobnie obsługuje dokument XML podany przez xmlHttpRequest ale przynajmniej w czytaniu HTML'a zawsze przyjmuje atrybuty pisane tylko dużymi literami (nawet jeśli w strukturze masz pisane małymi). Na próbę zapisz tak: Kod xml.getElementsByTagName("name")[i].getAttribute("ID"); ..i zobacz czy IE to łyknie. To tyle ile mi przychodzi do głowy. Generalnie myślę, że sam poprzez alerty czy z pomocą script debuggera możesz szybko dojść gdzie jest różnica. =>TomASS Cytat FF bardzo po 'macoszemu' traktuje pliki XML, nie zwraca uwagi na drobne błędy, za to IE (na którego wszyscy narzekają) nie toleruje błędów: to nie jest do końca poprawny kod XML: Kod data> <name id="godzina">17:00</name> </data> daj na początku np: Kod <?xml version="1.0" encoding="UTF-8"?> a dotego jeśli genrujesz pliki przy pomocy php musisz dać:
Tylko ostatnie jest prawdą, reszta to bzdury. Dokument XML powinien zawierać deklaracje ale nie musi. Dokument XML bez deklaracji też jest poprawnie sformułowanym dokumentem. Zarówno IE i FF podchodzą do tego poprawnie, tzn parsują dokument jak XML (w domyślnym dla XML'a kodowaniu utf-8) kiedy tej deklaracji nie ma. Podaj mi przykład, w którym FF ignoruje błędy struktury XML, których IE nie toleruje?? Ten post edytował mariuszn3 4.05.2006, 14:11:30 |
|
|
5.05.2006, 09:51:35
Post
#7
|
|
Grupa: Zablokowani Postów: 46 Pomógł: 0 Dołączył: 12.01.2006 Ostrzeżenie: (10%) |
Cytat(mariuszn3 @ 2006-05-04 12:29:16) Druga rzecz.. to nie bardzo rozumiem, czemu w pętli for druga linia odwołuje się do elementu 'name' pod indeksem 0: Kod value = xml.getElementsByTagName("name")[0].firstChild.nodeValue; Chyba tam powinna być zmienna 'i' zamiast 0. Tak, racja. Tam powinno być "i". Jakiś czas temu znalazłem też ten błąd i u siebie poprawiłem, a na forum zapomniałem I jak? Ktoś może u siebie na kompa wrzucić ten kod, uruchomić i zerknąć co jest nie tak? |
|
|
5.05.2006, 12:17:15
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 2 258 Pomógł: 16 Dołączył: 21.09.2004 Skąd: Kielce Ostrzeżenie: (0%) |
Jeśli plik xml masz postaci:
to Twoja pętla jest źle skonstruowana. Przejdzie po childNodes głównego korzenia DOM czyli po elementach <data>. Tych możesz mieć tylko jeden, bo jest to element najwyższego poziomu, więc pętla przejdzie raz, wtedy wyszukasz element name, o indeksie "i" - który jest indeksem <data> w ....childNodes głównego korzenia. I dlatego po części to działa Powinieneś to rozwiązać tak: Kod var start = xml.getElementsByTagName("data")[0]; for (var i = 0; i < start.childNodes.length; i++) { if(start.childNodes[i].nodeName=="name") { key = start.childNodes[i].getAttribute("id"); value = start.childNodes[i].firstChild.nodeValue; result[key] = value; } } ------ Cytat Pierwsza rzecz, którą widzę - nie ważne ile elementów 'data' obok siebie będziesz miał w XML'u w IE pętla for przejdzie tylko raz Chodzi o to że ważne Elementów najwyższego poziomu może być cała jedna sztuka Inaczej dokument nie będzie poprawny. -------------------- -------------
------ |
|
|
6.05.2006, 12:01:47
Post
#9
|
|
Grupa: Zablokowani Postów: 167 Pomógł: 2 Dołączył: 15.02.2004 Ostrzeżenie: (30%) |
Cytat(revyag @ 2006-05-05 13:17:15) Jeśli plik xml masz postaci:
to Twoja pętla jest źle skonstruowana. Przejdzie po childNodes głównego korzenia DOM czyli po elementach <data>. Tych możesz mieć tylko jeden, bo jest to element najwyższego poziomu, więc pętla przejdzie raz, wtedy wyszukasz element name, o indeksie "i" - który jest indeksem <data> w ....childNodes głównego korzenia. I dlatego po części to działa Mój XML ma właśnie jeden główny katalog (root) oraz kilka podrzędnych, np:
Ten post edytował Martio 6.05.2006, 12:02:42 |
|
|
Wersja Lo-Fi | Aktualny czas: 19.04.2024 - 22:42 |