Bonjour à toutes et à tous.
Je viens vers vous car j'ai un problème lorsque je veux parser un flux XML avec du code JavaScript, le tout pour un moteur de recherche AJAX.
Mon flux est généré par une page en PHP :
Ce flux contient donc les 5 premiers numéros de séries connus dans ma table et commençant par la valeur entrée dans le moteur de recherche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 <?php include("../scr/cnx.php"); header("Pragma: no-cache"); header("Expires: 0"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Content-type: application/xml"); $xml = ""; // Matériel : $xml .= "<materiel>"; if(!empty($_REQUEST["query"])) { $req_numser="select * from materiel where numser like '" . strtoupper($_REQUEST["query"]) . "%' and hidden=0 order by numser limit 5"; $row_numser = pg_query($req_numser); $nb = pg_num_rows($row_numser); $xml .= "<nb>" . $nb . "</nb>"; if ($nb > 0) { while ($numser = pg_fetch_object($row_numser)) { $xml .= "<item>" . $numser->numser . "</item>"; } } } else { $xml .= "<nb>0</nb>"; } $xml .= "</materiel>\n"; // echo utf8_encode($xml); ?>
Je visualise bien ce flux dans Firebug (je développe sous Firefox).
Voici mon parser JavaScript :
C'est magnifique, j'en pleure de joie car ça me fait une belle "liste déroulante" avec mes 5 résultats.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 var materielResult = obj.responseXML.getElementsByTagName('materiel'); document.getElementById('zoneResultats_large').innerHTML = ''; // Valeur du noeud <nb> : nb = materielResult.item(0).childNodes.item('nb').firstChild.nodeValue; if (nb > 0) { affichage = 1; // On définit la hauteur de la liste en fonction du nombre de résultats et de la hauteur de ligne var hauteur = nb * 24; hauteur = (hauteur > 300) ? 300 : hauteur; with(document.getElementById('zoneResultats_large').style) { visibility = 'visible'; height = hauteur + 'px'; } var li = document.createElement('li'); var texte = document.createTextNode('Matériel :'); li.style.textDecoration = "underline"; li.style.fontWeight = "bold"; li.appendChild(texte); document.getElementById('zoneResultats_large').appendChild(li); for (var i = 1; i <= nb; i++) { materiel = materielResult.item(0).childNodes.item(i).firstChild.nodeValue; var li = document.createElement('li'); var a = document.createElement('a'); var texte = document.createTextNode(materiel); a.appendChild(texte); a.setAttribute('href', '#'); // A MODIFIER !!! a.setAttribute('title', materiel); li.appendChild(a); document.getElementById('zoneResultats_large').appendChild(li); } } else { affichage = 0; }
---
Là où se complique, c'est parce que je veux effectuer cette recherche sur 2 tables : la première étant la table du matériel, et la deuxième étant la table des RMA effectués sur ce matériel.
Dans mon fichier PHP, je procède exactement de la même manière pour ajouter dans le flux XML les résultats de ma 2e requête, sauf que je crée un nouveau noeud <rma> au lieu de <materiel>. Je les vois bien en visualisant dans Firebug.
Par contre, j'ai une belle erreur JavaScript :
Voici mon flux avec 1 seule requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 materielResult.item(0) is null [Break on this error] nb = materielResult.item(0).firstChild.nodeValue;
Et celui avec les 2 requêtes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <materiel><nb>5</nb><item>82654061043</item><item>8265U061041</item><item>8265U061042</item><item>8265U061043 </item><item>8265U061044</item></materiel>
Je sais, mon flux est dégueulasse à regarder car je n'ai pas mis de retour à la ligne ni de tabulation, mais c'est pour éviter que le parser interprète chaque retour chariot comme un item "undefined" :/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <materiel><nb>5</nb><item>82654061043</item><item>8265U061041</item><item>8265U061042</item><item>8265U061043 </item><item>8265U061044</item></materiel> <rma><nb>1</nb><item>883878</item></rma>
Je sèche depuis hier dessus. Je ne comprends pas pourquoi mon bout de JavaScript n'arrive plus à trouver le premier item du noeud <materiel>.
Auriez-vous une solution ou quelques pistes s'il vous plaît ? D'avance merci et j'espère avoir posté dans le bon forum car je ne savais pas s'il fallait poster dans le forum XML, JavaScript ou AJAX
Partager