Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax][xml][prototype] Parsowanie xmla i podwojony krok pętli
Forum PHP.pl > Forum > XML, AJAX > AJAX
yaro
Mam mały problem z parsowaniem xml-a.
Mam pięć elementów w xml-u a musze podać że mam 10 i krok pętli zwiększyć do 2, żeby 'skakała' co 2.
Nie rozumiem dlaczego sie tak dzieje sad.gif
Poniżej daje kod.

  1. <TR>
  2. <TD>N.</TD>
  3. <TD>Data:</TD>
  4. <TD>Rozmiar:</TD>
  5. <TD>Od:</TD>
  6. <TD>Temat:</TD>
  7. </TR>
  8. </thead>
  9. <tbody id="mails">
  10. </tbody>
  11. </TABLE>


Kod
function getHTML()
{
    var url = 'test.xml';
    var myAjax = new Ajax.Request( url, { onComplete: showResponse });
}

function showResponse(originalRequest)
{
    //$('mails').innerHTML = originalRequest.responseText;
    d = $("mails");
    record = originalRequest.responseXML.getElementsByTagName("record");
    for (i = 0; i < record.length; i++) {
        tr = document.createElement("tr");
        td = document.createElement("td");
        for (j = 1; j < 10; j+=2) {  // w tej linii musiałem podwoić krok pętli
            td = document.createElement("td");
            td.innerHTML = record[i].childNodes[j].childNodes[0].nodeValue;
            tr.appendChild(td);
        }
        d.appendChild(tr);
    }
}


test.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <records>
  3. <record>
  4. <imie>1</imie>
  5. <nazwisko>2</nazwisko>
  6. <cos>3</cos>
  7. <cos2>4</cos2>
  8. <cos3>5</cos3>
  9. </record>
  10. </records>


Dodam że problem jest chyba w przeglądarkach innych niż ie
mariuszn3
Chodzi o to, że węzły tekstowe też w Twojej pętki są brane pod uwagę jako dzieci elementu.. więc kolejność wychodzi taka - td, #text, td, #text itd.
Możesz to naprawić poprzez wyciągnięcie listy elementów (czyli węzłów o nodeType równym 1) i potem iterowanie tej listy
bigZbig
Dodam jedynie ze w Twoich wezlach tekstowych sa biale znaki (spacje i znaki przejscia do nowej lini). Mozesz usunac biale znaki w pliku xml i nie bedziesz musial nic zmieniac po stronie js, ale to co podpowiada mariuszn3 jest lepsze.
yaro
Zrobiłem coś takiego ale niestety dalej nie działa sad.gif
Szukałem w kursie Javascript Cookbook i tam było coś podobnego i na podstawie tego co było w kursie to zrobiłem to, ale nie dokońca dobrze winksmiley.jpg
Prosze o pomoc, bo już nie mam sił

Kod
function showResponse(originalRequest)
{
    d = $("mails");
    record = originalRequest.responseXML.getElementsByTagName("record");

    for (i = 0; i < record.length; i++) {
        tr = document.createElement("tr");

        for (j = 0; j < record[i].childNodes.length; j++) {
            if (record[i].childNodes[j].nodeType != 1) {
                record[i].removeChild(record.childNodes[record.childNodes.length - 1]);
            }
            else
            {
                td = document.createElement("td");
                td.innerHTML = record[i].childNodes[j].firstChild.nodeValue;
                tr.appendChild(td);    
            }
        }
        d.appendChild(tr);
    }
}
mariuszn3
Pierwszy błąd jaki widzę jest w pętli for w tej linijce:
Kod
record[i].removeChild(record.childNodes[record.childNodes.length - 1]);

zwróć uwagę, że zawsze kasujesz ostatni element a nie element o indeksie j. W ogóle po co go kasujesz chcesz usunąć wszystkie te zbędne węzły tekstowe? To raczej niepotrzebna robota. Choć może czegoś w Twoim algorytmie nie złapałem.
Myśle, że najlepiej jak zrobisz podobnie tak jak poprzednio tylko wyciągnij wszystkie elementy (nie węzły - to różnica) - tak jak Ci sugerowałem poprzednio. Jest nawet lepsza na to metoda niż porównywanie nodeType:
Kod
var recordElements = record[i].getElementsByTagName('*');
for (j = 0; j < recordElements.length; j++) {
                td = document.createElement("td");
                td.innerHTML = recordElements[j].firstChild.nodeValue;
                tr.appendChild(td);    
}

Tylko pamiętaj, że multiselektor (*) w getElementsByTagName nie zadziała w IE5 pod windowsem. Zamiast tego dla IE5 można zastosować własność 'all' zwraca dokładnie to samo.
yaro
Chciałem sie najpierw sam troche pomęczyć i szukałem pomocy w kursach, ale jak widać co pomoc człowieka to będzie dobrze smile.gif
Dzięki, już działa dobrze
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.