Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: prototype i ResponseXML
Forum PHP.pl > Forum > XML, AJAX > AJAX
Apo
Witam

Mam pewien problem przy używaniu ResponseXML w prototype:

  1. function addComment() {
  2.  
  3. var myAjax = new Ajax.Request(
  4. url,
  5. {
  6. method: 'post',
  7. parameters: pars,
  8. onComplete: showResponse,
  9. onFailure: showError
  10. });
  11.  
  12. }
  13.  
  14. function showResponse(Request)
  15. {
  16. response = Request.responseXML; // tu występuje błąd
  17.  
  18. error = response.getAttribute('error');
  19. nick = response.getAttribute('nick');
  20. email = response.getAttribute('email');
  21. www = response.getAttribute('www');
  22. content = response.getAttribute('content');
  23.  
  24. if(error == 1)
  25. alert('Wystąpił błąd. Komentarz nie został dodany');
  26. else
  27. $('add_comment').innerHTML = content;
  28. }
  29.  
  30. function showError(Request)
  31. {
  32. alert('Wystąpił błąd!');
  33. }
  34.  
  35. var myGlobalHandlers = {
  36. onCreate: function(){
  37. Element.show('loader');
  38. },
  39.  
  40. onComplete: function() {
  41. if(Ajax.activeRequestCount == 0){
  42. Element.hide('loader');
  43. }
  44. }
  45. };
  46.  
  47. Ajax.Responders.register(myGlobalHandlers);


No i błąd występuje przy odbieraniu XML w : response = Request.responseXML;
Cały czas jest pokazany loader, że trwa zapisywanie komentarza (linie poniżej wogle nie są wykonywane), gdy zmienie
response = Request.responseXML; na
response = Request.responseText; i sprawdze co zwraca skrypt to otrzymuje xml wygenetowany przez XMLwriter:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <nick>Apo</nick><email>test@op.pl</email><www></www><content>Lorem ipsum Lorem ipsum Lorem ipsum</content><date>1169917331</date>


Pozdrawiam
defrag
Wydaje sie ze po prostu zle parsujesz xmla
Przykldadowe poprawne parsowanie:
  1. <?php
  2. var xml = req.responseXML;
  3.  
  4. var rekordy = xml.getElementsByTagName('results')[0].childNodes;
  5. var oS = document.createElement('select');
  6. oS.setAttribute('id', 'lstSubKats');
  7. oS.style.width = '220px';
  8. ss.appendChild(oS);
  9.  
  10.  
  11. var oUl = document.createElement('div');
  12. ss.appendChild(oUl);
  13. //
  14. for(i=0; i < rekordy.length; i++) {
  15.  
  16. if (rekordy[i].hasChildNodes()) {
  17.  
  18. var opt = document.createElement('option');
  19. opt.setAttribute('value', xml.getElementsByTagName('id')[i].childNodes[0].nodeValue );
  20. oS.appendChild(opt);
  21. var oText = document.createTextNode(xml.getElementsByTagName('nazwa')[i].childNodes[0].nodeValue);
  22. opt.appendChild(oText);
  23.  
  24. }
  25. }
  26. var oB = document.createElement('input');
  27. oB.setAttribute('type', 'button');
  28. oB.setAttribute('value', 'Dodaj');
  29. oB.style.width = '220px';
  30. oB.onclick = add3;
  31. ss.appendChild(oB);
  32. ?>


Najlatwiej uzyc getElementsByTagName do uzyskania dostepu do wezlow.
Apo
Defrag tylko mi to co jest poniżej tego:
  1. response = Request.responseXML; // TEGO
  2.  
  3. error = response.getAttribute('error');
  4. nick = response.getAttribute('nick');
  5. email = response.getAttribute('email');
  6. www = response.getAttribute('www');
  7. content = response.getAttribute('content');
  8.  
  9. if(error == 1)
  10. alert('Wystąpił błąd. Komentarz nie został dodany');
  11. else
  12. $('add_comment').innerHTML = content;


Kod wogle sie nie wykonuje, nawet jak jakis alert wstawie za tym, dodam że xml generuje w taki sposób:
  1. <?php
  2. header('Content-type: text/xml');
  3. $xw = new xmlWriter();
  4. $xw->openMemory();
  5. $xw->startDocument('1.0','UTF-8');
  6.  
  7. if($error)
  8. $xw->writeElement('error', 1);
  9.  
  10. $xw->writeElement('nick', $model->nick);
  11. $xw->writeElement('email', $model->email);
  12. $xw->writeElement('www', $model->www);
  13. $xw->writeElement('content', $model->content);
  14. $xw->writeElement('date', $model->date);
  15.  
  16. $xw->endDtd();
  17. echo $xw->outputMemory(true);
  18. ?>
orson
witam

zmień Content-type na application/xml

pozdrawiam
Apo
Heh dalej to samo, nic poniżej lini response = Request.responseXML; sie nie wykonuje i cały czas jest pokazany Loader ;/
yaro
skomentuj error = response.getAttribute('error');
Bo wydaje mi się że za każdym razem musi być tag <error>
Apo
Tez nic, i tak pisałem ze reszta sie nie wykonuje ;/
  1. response = Request.responseXML;
  2. alert(response); // to dziala
  3. // to poniżej wogle nie dziala, czyli występuje błąd przy czytaniu wartości
  4. error = response.getAttribute('error');
  5. nick = response.getAttribute('nick');
  6. email = response.getAttribute('email');
  7. www = response.getAttribute('www');
  8. content = response.getAttribute('content');
  9.  
  10. if(error == 1)
  11. alert('Wystąpił błąd. Komentarz nie został dodany');
  12. else
  13. $('add_comment').innerHTML = content;
PiotrLegnica
Po pierwsze, to ten XML nie jest poprawny. Dokument XML może mieć tylko jeden root element, u ciebie jest ich więcej.
Powinno być mniej więcej tak:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <response>
  3. <nick>Apo</nick>
  4. <email>test@op.pl</email>
  5. <www></www>
  6. <content>Lorem ipsum Lorem ipsum Lorem ipsum</content>
  7. <date>1169917331</date>
  8. <error>0</error>
  9. </response>

Generowane np. tak:
  1. <?php
  2. header('Content-type: text/xml; charset=utf-8');
  3.  $xw = new xmlWriter();
  4.  $xw->openMemory();
  5.  $xw->startDocument('1.0','UTF-8');
  6.  
  7.  $xw->startElement('response');
  8.  
  9.  $xw->writeElement('error', $error);
  10.  $xw->writeElement('nick', $nick);
  11.  $xw->writeElement('email', $email);
  12.  $xw->writeElement('www', $www);
  13.  $xw->writeElement('content', $content);
  14.  $xw->writeElement('date', $date);
  15.  
  16.  $xw->endElement();
  17.  
  18.  $xw->endDocument();
  19.  echo $xw->outputMemory(true);
  20. ?>

Element error dodawaj zawsze, a wartości możesz pobierać np. tak:
Kod
var root = $A(Request.responseXML.getElementsByTagName('response'))[0];
var error = root.firstChild;
var nick = error.nextSibling;
var email = nick.nextSibling;
var www = email.nextSibling;
var content = www.nextSibling;

if(error.firstChild.nodeValue == 1)
alert('Wystąpił błąd. Komentarz nie został dodany');
else
$('add_comment').innerHTML = content.firstChild.nodeValue;

Jeśli masz stałą kolejność elementów, lub
Kod
var error = $A(root.getElementsByTagName('error'))[0];
var nick = $A(root.getElementsByTagName('nick'))[0];
var email = $A(root.getElementsByTagName('email'))[0];
var www = $A(root.getElementsByTagName('www'))[0];
var content = $A(root.getElementsByTagName('content'))[0];
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.