Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [prototype] Parsowanie XML
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
MarcinTryka
Witam. Poprzez Ajax otrzymuje taki XML:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <users>
  3.  <user id="11">
  4.    <login>admin</login>
  5.  </user>  
  6.  <user id="23">
  7.    <login>testowe</login>
  8.  </user>
  9. </users>


Mój problem jest dość podstawowy, ale nie mogę znaleźć jakiegoś spójnego źródła informacji. Manual/Api Prototype jest dobry dla kogoś kto już się w tym w miarę swobodnie porusza i chce sobie przypomnieć nazwę metody. Tutoriale natomiast prezentują osobno pobieranie XMLa, osobno wstawianie danych z JSON na stronę, ja jednak nie mogę tego połączyć w całość.

Generalnie mam zmienną z XMLem (string).
chciałbym tą pobraną listę użytkowników wrzucić do HTML-owej listy:
  1. <ul id="users_list">
  2. </ul>

Nie mogłem znaleźć jakiegoś rozsądnego tutoriala pokazującego techniczne aspekty chodzenia po strukturze XMLa. Skorzystałem z czegoś co miało mi przerobić XML na jakąśtam strukturę (łatwą do porzejścia w przykładach):

var xotree = new XML.ObjTree();
var tree = xotree.parseXML( respXML );


Następnie robię coś takiego:

for(var lUser in tree.users.user){
$('users_list').insert(new Element("li", { id: "moo" }).update(lUser.login));
}

I guzik. lista na stronie powiększa się o kilkadziesiąt pustych <li id="moo"></li>, mimo iż XML zawiera tylko dwóch użytkowników.

Byłbym bardzo wdzięczny za jakiś przykład bądź link do takowego, wyjaśniający jak z tego XMLa mam wyciągać kolejne dane.

-- Edit --

A może olać sobie zabawę z XMLem i w php generować gotowy kod, i zamiast Ajax.Request uzyć Ajax.Update, który mi to bez problemu wrzuci w podane mu miejsce?
paziek
nie znam się na prototype, ale normalny XMLHttpRequest oferuje coś takiego jak responseXML, czyli XML string sparsowany na DOM.

No nic, mając XMLa w stringu, robisz tak:

  1. try {
  2.    parser=new DOMParser();
  3.    xmlDoc=parser.parseFromString(text,'text/xml');
  4. } catch(e) {
  5.    xmlDoc=new ActiveXObject('Microsoft.XMLDOM');
  6.    xmlDoc.async='false';
  7.    xmlDoc.loadXML(text);
  8. }

gdzie zmienna text to nasz XML w stringu, a xmlDoc to sparsowany XML string do DOM.

Teraz możesz użyć XPatha, albo DOMa do wyciągania wartości.

Podam rozwiażanie na przykładzie DOMa, bo akurat tutaj będzie prostsze.

  1. var root=xmlDoc.documentElement;
  2. if(root.hasChildNodes()) {
  3.    var el=xmlDoc.documentElement.childNodes,x=el.length,i;
  4.    for(i=0;x>i;i++) {
  5.       var li=document.createElement('li');
  6.       li.id=el[i].getAttribute('id');
  7.       li.appendChild(document.createTextNode(el[i].firstChild.firstChild.nodeValue));//zakłada, że jest jakaś wartość loginu, można dać w try{}catch(){} jeśli może nie być
  8.       $('users_list').appendChild(li);
  9.    }
  10. }


tylko uważaj na whitespace, najlepiej to wyświetlaj XML w jednej linijce
  1. <users><user id="11"><login>admin</login></user><user id="23"><login>testowe</login></user></users>

ewentualnie użyj wspomnianego XPath, tam akurat nie ma problemu z whitespace.
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.