Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

js, php et xhr : insertion xml

16 réponses
Avatar
unbewusst.sein
je construis un fragment html par DOMDocument en php :

le fichier "categories.php" :
<?php
header('Content-type: text/xml; charset=utf-8');

function add_li($doc, $ul, $idx, $name){
$li=$doc->createElement('li');
$li=$ul->appendChild($li);
$li->setAttribute('onclick', "load_items(this,
".$idx.");return false");
$li->nodeValue=$name;
return $li;
}
$doc=new DOMDocument('1.0', 'utf-8');
$doc->preserveWhiteSpace=true;
$ul=$doc->createElement('ul');
$ul=$doc->appendChild($ul);
$ul->setAttribute('class', 'categories');

$li=add_li($doc, $ul, "-1", "Toutes");

$db=new SQLite3('../../../landp.db');
$result=$db->query('SELECT * FROM categories;');
while ($row=$result->fetchArray()) {
$li=add_li($doc, $ul, $row['idx'], $row['name']);
}
echo $doc->saveXML();
?>

si, côté js, je l'inserre comme !a (avec responseXML) :
function load_categories() {
loadXMLDoc("php/categories.php",function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {

document.getElementById("categories").innerHTML=xmlhttp.responseXML;
}
});
}

alors, au niveau de la fenêtre du butineur, j'obtiens :

[object Document]

est-ce que ça signifie que je dois l'inserrer comme un fragment :
document.getElementById('categories').appendChild(xmlhttp.responseXML);
???

bon par contre si dans le fichier "categories.php" je change juste le
header pour :
header('Content-type: text/html; charset=utf-8');

ie. "text/html" au lieu de "text/xml" et que l'insertion se fait par
responseText :
document.getElementById("categories").innerHTML=xmlhttp.responseText;

alors j'ai le "bon" résultat.

autrement dit, est-il possible d'inserrer une reponse xml venant de php
comme un fragment (x)html ou pas ?

--
« Si tous ceux qui n'ont rien n'en demandaient pas plus,
il serait bien facile de contenter tout le monde. »
(Coluche)

10 réponses

1 2
Avatar
unbewusst.sein
Une Bévue wrote:

est-ce que ça signifie que je dois l'inserrer comme un fragment :
document.getElementById('categories').appendChild(xmlhttp.responseXML);
???



je viens d'essayer, !a donne que dalle o[ !!!

j'apprends par ailleurs et par hasard que « the PHP DOM interface is
highly non-standard. » et que « The "user contributed notes" are the
most useful part of the manual! ». Ce dont j'ai fait l'expérience ne
serait-ce que pour obtenir un document xhtml avec des balises link pour
le css, il faut étendre la classe DOMDocument...

see <http://www.stylusstudio.com/xmldev/200203/post90230.html>.

donc, j'imagine que sauf info pertinente et contraire je dois en rester
avec "responseText" :
document.getElementById("categories").innerHTML=xmlhttp.responseText;
--
« France soir est un journal à grand tirage,
il est donc excellent pour allumer la cheminée. »
(Miguel de Cervantès)
Avatar
Pascal Poncet
Le 30/08/2011 17:51, Une Bévue a écrit :
est-ce que ça signifie que je dois l'inserrer comme un fragment :
document.getElementById('categories').appendChild(xmlhttp.responseXML);



Non, justement, ce n'est pas un fragment, "responseXML" représente le
document entier, auquel il faut accéder par les méthodes et propriétés
du DOM.
Fais un console.log(xmlhttp.responseXML.nodeType) et tu obtiendras la
valeur 9 ... CQFD !

Donc, si tu veux récupérer tout le contenu du document, il faut aller
chercher son élément racine qui, lui-même, contient tous ses descendants.

La solution la plus courte et naturelle est d'aller chercher la
propriété "documentElement" de ta réponse.

(dis-donc, je croyais que c'était les doigts dans le nez... ;-) )


--
Cordialement,
Pascal
Avatar
unbewusst.sein
Pascal Poncet wrote:

Non, justement, ce n'est pas un fragment, "responseXML" représente le
document entier, auquel il faut accéder par les méthodes et propriétés
du DOM.
Fais un console.log(xmlhttp.responseXML.nodeType) et tu obtiendras la
valeur 9 ... CQFD !



OK, merci pour le tuyau, je n'utilise pas assez ce "console.log"...

Donc, si tu veux récupérer tout le contenu du document, il faut aller
chercher son élément racine qui, lui-même, contient tous ses descendants.

La solution la plus courte et naturelle est d'aller chercher la
propriété "documentElement" de ta réponse.



OK

(dis-donc, je croyais que c'était les doigts dans le nez... ;-) )



j'ai dit !a moi ?
j'étais assez présomptueux alors...

tiens, question : je dois inserrer dans une div d'id = item, un ensemble
d'éléments qui n'ont pas de "root", je veux dire, en html, ça se
présente comme ça :
<div ...
<span...
<span...
</div>
etc
<div ...
<span...
<span...
</div>

donc, pour que ce soit "xmlisable" j'ai wrappé tout ça dans une div d'id
item aussi, peut-être n'est-ce pas une bonne idée ?? (le même id)

aurais-tu une meilleure idée ?

--
« Il n'existe que deux choses infinies, l'univers et
la bêtise humaine... mais pour l'univers, je n'ai pas de
certitude absolue. »
(Albert Einstein)
Avatar
unbewusst.sein
Une Bévue wrote:

donc, pour que ce soit "xmlisable" j'ai wrappé tout ça dans une div d'id
item aussi, peut-être n'est-ce pas une bonne idée ?? (le même id)



bon, j'ai finale mis, pour cette div, id = tmp_item, de manière à avoir
des IDs uniques...

là, côté php, si j'envoie en text/xml,
console.log(xmlhttp.responseXML.nodeType);
me dis :
null
TypeError: Result of expression 'xmlhttp.responseXML' [null] is not an
object.

et :
console.log(xmlhttp.responseXML);
me dis :
null
TypeError: Result of expression 'xmlhttp.responseXML' [null] is not an
object.

ce que je ne comprends pas vu que, si j'envoie la réponse php en
text/html et que j'inserre la div d'id tmp_item, donc envoyée par le
php, dans la div existante d'id = item, j'obtiens le "bon" résultat.
Bien évidemment à la présentation près car le css n'est pas prévu pour
l'imbrication de div id = tmp_item dans div id = item...

je fais ça juste pour mettre au point.

donc, je ne pige pas ce qui se passe quand j'envoie par php en text/xml
et que je reçois en js par responseXML...

--
« Le temps est un grand maitre, dit-on. Le malheur est
qu'il tue ses élèves. »
(Berlioz)
Avatar
unbewusst.sein
Une Bévue wrote:

donc, je ne pige pas ce qui se passe quand j'envoie par php en text/xml
et que je reçois en js par responseXML...



bon, je viens de faire un nouvel essai, simplement en affichant à la
console :
console.log(xmlhttp.responseText);
au lieu de responseXML.

là, j'obtiens bien :
landp.js:50<?xml version="1.0" encoding="utf-8"?>
<div id="tmp_item"><div class="row_title">
...
</div></div>
ce qui était espéré, du coup, je comprends encore moins bien pourquoi
xmlhttp.responseXML est null.

à moins que ce soit ma dernière ligne de php qui soit fautive pour
envoyer du xml :
echo $doc->saveXML();
???
--
« Les femmes sont extrêmes ; elles sont meilleures ou pires que
les hommes. »
(Jean de La Bruyère)
Avatar
SAM
Le 31/08/11 10:14, Une Bévue a écrit :

là, j'obtiens bien :
landp.js:50<?xml version="1.0" encoding="utf-8"?>
<div id="tmp_item"><div class="row_title">
...
</div></div>
ce qui était espéré,



donc tout est bien dans le meilleur des mondes, non ?

Où est le blème ? (finalement)


--
Stéphane Moriaux avec/with iMac-intel
Avatar
Pascal Poncet
Le 31/08/2011 10:14, Une Bévue a écrit :
bon, je viens de faire un nouvel essai, simplement en affichant à la
console :
console.log(xmlhttp.responseText);
au lieu de responseXML.

là, j'obtiens bien :
landp.js:50<?xml version="1.0" encoding="utf-8"?>
<div id="tmp_item"><div class="row_title">
...
</div></div>



Ok, mais je ne sais pas ce que tu emploies comme type de console.
Avec Firebug, tu vois facilement le source de ce qui est récupéré,
quelle que soit la façon, responseText ou responseXML.
En plus, il y a un onglet spécial "Réseau/XHR" pour ça.

Et puis, au-delà, je donne parfaitement raison à SAM.
Dans la mesure où, en réalité, tu pars d'un fragment HTML pour l'insérer
dans un document HTML, il n'y a aucune raison de passer par responseXML,
donc... pas de problème !

Même à la source, en PHP, je ne suis pas convaincu de la nécessité de
passer par des fonctions DOM pour pondre ton fragment.
Je rappelle que c'est un langage de template HTML natif.
Après, chacun y fait comme qu'y veut, mais faudra pas pleurer sur la
complexité.


--
Cordialement,
Pascal
Avatar
SAM
Le 31/08/11 14:32, Pascal Poncet a écrit :

Et puis, au-delà, je donne parfaitement raison à SAM.
Dans la mesure où, en réalité, tu pars d'un fragment HTML pour l'insérer
dans un document HTML, il n'y a aucune raison de passer par responseXML,
donc... pas de problème !



J'imagine qu'une fois le fragment inséré il est alors tout à fait
possible d'en exploiter sa représentation DOM ?
Bon, peut-être pas avant qu'il ne soit effectivement et réellement inséré ?
(ex: on ne peut tenter d'obtenir les childNodes du responseText)

--
Stéphane Moriaux avec/with iMac-intel
Avatar
unbewusst.sein
Pascal Poncet wrote:


Ok, mais je ne sais pas ce que tu emploies comme type de console.
Avec Firebug, tu vois facilement le source de ce qui est récupéré,
quelle que soit la façon, responseText ou responseXML.
En plus, il y a un onglet spécial "Réseau/XHR" pour ça.



Ben, je n'ai pas Firebug, c'est à vérifier si je peux l'avoi ou pas sur
TenFourFoxG3 qui est un "Firefox" pour PPC, qui marche d'ailleurs pas
mal avec CSS3 et même certaines fonctions HTML5.

Et puis, au-delà, je donne parfaitement raison à SAM.
Dans la mesure où, en réalité, tu pars d'un fragment HTML pour l'insérer
dans un document HTML, il n'y a aucune raison de passer par responseXML,
donc... pas de problème !



Alors pourquoi je pense ça, c'est que je me suis entrainé avec des tutos
trouvés sur le web et, qu'avec un -- vrai -- fichier xml, ça marche
super. MAIS, comme je l'ai déjà mentionné, php est HORS standard...

Donc oui, je passerai par responseText...

Même à la source, en PHP, je ne suis pas convaincu de la nécessité de
passer par des fonctions DOM pour pondre ton fragment.



Là je suis d'accord de toutes façons le code php pour DOMDocument est
pourri en php, pour avoir une sortie xhtml; c'est galère.

Je rappelle que c'est un langage de template HTML natif.



le php ? là je ne pige pas trop ton assertion "langage de template HTML
natif" ...

ce qui est absolument, sûr, je le dis même si je sais bien que je ne
suis pas informatien, c'est un langage mal conçu, très mal documenté, et
j'ai été content de le lire sous la plume de pro du xml, ce que je ne
suis pas.

pour résumer, le "xml" produit par php doit avoir qqc de spécial car
responseXML marche très bien avec un fichier xml "en dur", externe.

maintenant je ne tiens pas absolument à faire du DOM, je m'y suis mis
que -- pour essai -- et franchement là aussi il y a un truc pour
générer trois lignes de code html, il en faut au moins 10 en
DOMDocument...

où est l'efficacité ?


Après, chacun y fait comme qu'y veut, mais faudra pas pleurer sur la
complexité.



je ne pleure pas, j'essayais de savoir si qqc ne m'avait pas échappé...

--
« Les faiblesses des hommes font la force des femmes. »
(Voltaire)
Avatar
unbewusst.sein
SAM wrote:

donc tout est bien dans le meilleur des mondes, non ?

Où est le blème ? (finalement)



Euh; pour avoir ce résultat, il faut que je prenne :
xhr.responseText;

alors que, si j'ai bien compris, il faudrait prendre :
xhr.responseXML;non ???

--
« Les faiblesses des hommes font la force des femmes. »
(Voltaire)
1 2