Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [AJAX][XML] parsowanie pliku XML
Forum PHP.pl > Forum > XML, AJAX
TheaSiX
niedawno zacząłem przygodę z AJAXem i rzecz, którą bardzo chcę się nauczyć jest prawidłowe parsowanie zewnętrznych plików XML. Sterte książek mam przed sobą, ale nie mogę zrozumieć pewnego zachowania..

Wszystko robię na przykładnie pliku XML z last.fm (http://cdn.last.fm/bestof/2009/bestof2009.xml).

Chciałem wyodrębnić 10 pierwszych nazw i lokacji z tego pliku.. Zanim przeszedłem do tworzenia całego skryptu, utworzyłem nowy plik i zapisałem w nim tylko jednego artyste, czyli struktura wyglądała tak:
  1. <?xml version="1.0" ?>
  2. <artist>
  3. <position>1</position>
  4. <name>Lady GaGa</name>
  5. <location>New York, United States</location>
  6. <iso>US</iso>
  7. <url>http://www.last.fm/music/Lady+GaGa</url>
  8. <images>
  9. <small>http://userserve-ak.last.fm/serve/34/27576621.png</small>
  10. <medium>http://userserve-ak.last.fm/serve/64/27576621.png</medium>
  11. <large>http://userserve-ak.last.fm/serve/126/27576621.png</large>
  12. </images>
  13. <stats>
  14. <overall>
  15. <plays>35562384</plays>
  16. <listeners>955164</listeners>
  17. </overall>
  18. <year>
  19. <listeners>755309</listeners>
  20. <gigs>253</gigs>
  21. <festivals>54</festivals>
  22. <users_attended>15709</users_attended>
  23. </year>
  24. </stats>
  25. <tags>
  26. <tag>
  27. <name>pop</name>
  28. <url>http://www.last.fm/tag/pop</url>
  29. </tag>
  30. <tag>
  31. <name>dance</name>
  32. <url>http://www.last.fm/tag/dance</url>
  33. </tag>
  34. <tag>
  35. <name>electronic</name>
  36. <url>http://www.last.fm/tag/electronic</url>
  37. </tag>
  38. </tags>
  39. <album>
  40. <name>The Fame</name>
  41. <url>http://www.last.fm/music/Lady+GaGa/The+Fame</url>
  42. <images>
  43. <small>http://userserve-ak.last.fm/serve/34s/24408387.png</small>
  44. <medium>http://userserve-ak.last.fm/serve/64s/24408387.png</medium>
  45. <large>http://userserve-ak.last.fm/serve/126/24408387.png</large>
  46. </images>
  47. <stats>
  48. <overall>
  49. <plays>17626729</plays>
  50. <listeners>359732</listeners>
  51. </overall>
  52. <year>
  53. <plays>18487195</plays>
  54. </year>
  55. </stats>
  56. <tags>
  57. <tag>
  58. <name>pop</name>
  59. <url>http://www.last.fm/tag/pop</url>
  60. </tag>
  61. <tag>
  62. <name>albums i own</name>
  63. <url>http://www.last.fm/tag/albums%20i%20own</url>
  64. </tag>
  65. <tag>
  66. <name>dance</name>
  67. <url>http://www.last.fm/tag/dance</url>
  68. </tag>
  69. </tags>
  70. </album>
  71. </artist>


Mój kod wygląda naastępująco:
  1. function doAjax() {
  2. var myRequest = new XMLHttpRequest;
  3. myRequest.open("GET","small.xml",false);
  4. myRequest.send(null);
  5. response = myRequest.responseXML;
  6. if(myRequest.readyState == 4) {
  7. if(myRequest.status == 200) {
  8. var artist = response.getElementsByTagName("name")[0].firstChild.nodeValue;
  9. var location = response.getElementsByTagName("location")[0].firstChild.nodeValue;
  10. window.document.getElementById('resultDiv').innerHTML = artist + "-" + location;
  11. }
  12. }
  13. }


dzięki niemu bezproblemowo otrzymuje string "Lady Gaga - New York, United States". Problem zaczyna się gdy do pliku XML dodam kolejnego artyste. Wtedy podmiana elementu tablicy na 1 nie działa, a również wyświetlanie pierwszego elementu [0] nie jest ponownie możliwe.

próbowałem najpierw wybierać wszystkie znaczniki ARTIST i z niego wziąć childNodes[1] dla nazwy wykonawcy, ale również nie działa..

ktoś może potrafi wytknąć mi błędy jakie robię w rozumowaniu tego parsowania, jakiekolwiek wskazówki i naprowadzenie na właściwą drogę sa na wagę złota smile.gif

Zauważyłem dziwną rzecz. postanowiłem sam stworzyć prosty plik xml, który przedstawia się następująco:
  1. <?xml version="1.0" ?>
  2. <artist>
  3. <name>Artysta 1</name>
  4. <location>Lokalizacja 1</location>
  5. </artist>
  6. <artist>
  7. <name>Artysta 2</name>
  8. <location>Lokalizacja 2</location>
  9. </artist>


wyświetlanie robię poprzez:

  1. var myRequest = new XMLHttpRequest;
  2. myRequest.open("GET","small.xml",false);
  3. myRequest.send(null);
  4. response = myRequest.responseText;
  5. if(myRequest.readyState == 4) {
  6. if(myRequest.status == 200) {
  7. document.getElementById('writeroot').innerHTML += response;
  8. }
  9. }


i wyświetla ale tylko wszystko co jest zawarte w pierwszym <artist></artist>, a specjalnie zmieniłem na responseText, aby otrzymać cały plik. Czy to może być coś z konfiguracją serwera, z plikiem? czy coś innego? jestem w kropce, a błąd wydaje się być absurdalny..
taktu
odp. jQuery, manipulacje DOM w JS to istne bagno, dlatego ta biblioteka ( i kilka innych żeby nie było winksmiley.jpg ) jest tak popularna.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.