Lecture automatique du XML [ Répondre ] Par : Benjamin Leperchey on 2007-06-18 17:07 | [forum:52747] |
Ci dessous une petite fonction qui parse automatiquement un arbre DOM et qui renvoie un objet Javascript. Ca permet de remplacer les 'parent.getElementsByTagName' et autres 'parent.getData'. Par exemple, après avoir récupéré dans xmlPage le doc suivant : <PAGE> <SELECT> <LIBELLE>Ma liste déroulante</LIBELLE> <OPTIONS> <OPTION>...</OPTION> <OPTION> <LIBELLE>Mon option</LIBELLE> ... </OPTION> </OPTIONS> </SELECT> ... </PAGE> il suffit, pour récupérer les donnees, de faire : if (xmlPage.parseErrorXML() == 0) { var parsedXml = parseXmlAsObject(xmlPage.xmlDoc); // 'Ma liste déroulante' var txt = parsedXml.SELECT[0].LIBELLE; // 'Mon option' var txt = parsedXml.SELECT[0].OPTIONS[0].OPTION[1].LIBELLE; } C'est nettement plus simple que l'utilisation du DOM, et ça permettrait de se passer avantageusement des XMLObjectSauvegarde dans la majorité des cas : à part pour le composant tableau/tableur (et encore), il ne sert à rien de garder le XML de description dans l'element ou le composant. On pourrait l'ajouter dans la boite à outils XML. ---------------------------------------------- function parseXmlAsObject(xml) { switch (xml.nodeType) { case 9: // DOCUMENT_NODE return Xml.parse(xml.documentElement); case 1: // ELEMENT switch (xml.childNodes.length) { // empty : return null case 0: return null; // only one text node : return its content as a string case 1: if (xml.firstChild.nodeType==3) return Xml.parse(xml.firstChild); // several children or a single, non-text node : // return an object mapping tag names to arrays default: var obj = {}; var length = xml.childNodes.length; for (var i=0; i<length; i++) { var node = xml.childNodes[i]; // keep only elements if (node.nodeType != 1) continue; // if the tag was not seen before : create an empty array if (obj[node.tagName] == undefined) obj[node.tagName] = []; // add the value of the child to the existing array obj[node.tagName].push(Xml.parse(node)); } return obj; } case 3: // TEXT_NODE case 4: // CDATA_SECTION_NODE return xml.nodeValue; case 2: // ATTRIBUTE_NODE case 5: // ENTITY_REFERENCE_NODE case 6: // ENTITY_NODE case 7: // PROCESSING_INSTRUCTION_NODE case 8: // COMMENT_NODE case 10: // DOCUMENT_TYPE_NODE case 11: // DOCUMENT_FRAGMENT_NODE case 12: // NOTATION_NODE default: return null; } } |