Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ajax][xml][prototype] Parsowanie xmla i podwojony krok pętli
yaro
post 30.07.2006, 17:44:45
Post #1





Grupa: Zarejestrowani
Postów: 160
Pomógł: 4
Dołączył: 22.04.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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

Ten post edytował yaro 30.07.2006, 17:57:25


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
mariuszn3
post 31.07.2006, 14:25:05
Post #2





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
bigZbig
post 31.07.2006, 14:28:46
Post #3





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
yaro
post 31.07.2006, 23:15:20
Post #4





Grupa: Zarejestrowani
Postów: 160
Pomógł: 4
Dołączył: 22.04.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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);
    }
}


--------------------
Go to the top of the page
+Quote Post
mariuszn3
post 31.07.2006, 23:28:58
Post #5





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mariuszn3 31.07.2006, 23:30:43
Go to the top of the page
+Quote Post
yaro
post 31.07.2006, 23:38:25
Post #6





Grupa: Zarejestrowani
Postów: 160
Pomógł: 4
Dołączył: 22.04.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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


--------------------
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: 24.07.2025 - 17:06