Surveiller ce forum | Commencer une nouvelle discussion Commencer une nouvelle discussion
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;
}
}

FEDER Powered By FusionForge Collaborative Development Environment Charte d'utilisation / Nous contacter / Mentions légales Haut de page