Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [advAJAX][XML] Problem z parsowaniem XML
Martio
post 2.05.2006, 20:08:23
Post #1





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


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.
Go to the top of the page
+Quote Post
mariuszn3
post 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.
Go to the top of the page
+Quote Post
Martio
post 4.05.2006, 08:18:17
Post #3





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


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.
Go to the top of the page
+Quote Post
TomASS
post 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ć:
  1. <?php
  2. header("Content-type: text/xml; charset=UTF-8"); 
  3. ?>


--------------------
Go to the top of the page
+Quote Post
eMartio
post 4.05.2006, 11:04:58
Post #5





Grupa: Zablokowani
Postów: 46
Pomógł: 0
Dołączył: 12.01.2006

Ostrzeżenie: (10%)
X----


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ć:
  1. <?php
  2. header("Content-type: text/xml; charset=UTF-8"); 
  3. ?>

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.
Go to the top of the page
+Quote Post
mariuszn3
post 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ć:
  1. <?php
  2.  
  3. header("Content-type: text/xml; charset=UTF-8");
  4.  
  5. ?>

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
Go to the top of the page
+Quote Post
eMartio
post 5.05.2006, 09:51:35
Post #7





Grupa: Zablokowani
Postów: 46
Pomógł: 0
Dołączył: 12.01.2006

Ostrzeżenie: (10%)
X----


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 smile.gif

I jak? Ktoś może u siebie na kompa wrzucić ten kod, uruchomić i zerknąć co jest nie tak?
Go to the top of the page
+Quote Post
revyag
post 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:
  1. <?xml version="1.0" encoding="ISO-8859-2"?>
  2. <data>
  3.    <name id="godzina">17:00</name>
  4. </data>

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 snitch.gif

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 smile.gif Elementów najwyższego poziomu może być cała jedna sztuka smile.gif Inaczej dokument nie będzie poprawny.


--------------------
-------------

------
Go to the top of the page
+Quote Post
Martio
post 6.05.2006, 12:01:47
Post #9





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


Cytat(revyag @ 2006-05-05 13:17:15)
Jeśli plik xml masz postaci:
  1. <?xml version="1.0" encoding="ISO-8859-2"?>
  2. <data>
  3.     <name id="godzina">17:00</name>
  4. </data>

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 snitch.gif


Mój XML ma właśnie jeden główny katalog (root) oraz kilka podrzędnych, np:

  1. <?xml version="1.0" encoding="ISO-8859-2"?>
  2. <data>
  3.    <name id="godzina1">17:00</name>
  4.    <name id="godzina2">18:00</name>
  5.    <name id="godzina3">19:00</name>
  6. </data>


Ten post edytował Martio 6.05.2006, 12:02:42
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 22:42