Bonjour à tous,
Premier complement au tuto "Xml partie 1".
Nous avons vu que les fichiers Xml doivent être chargé afin de les traiter. Seulement le chargement ne se fait d'un coup, surtout quand le fichier devient important.
De plus, nous avons vu comment accéder aux différentes données de notre objet xml, avec les
childnodes et les
attributes.
Nous allons voir maintenant comment suivre le chargement complet de notre fichier, et surtout je vis vous donner quelques fonctions qui permettent de traiter l'objet Xml de façon un peu plus sympathiques.
=>
Chargement d'un fichier Xml
Dans le cadre de Xml, il n'est pas approprié d'utiliser les propriétés getBytesLoaded, ... en effet elles ne correspondent pas réellement au chargement du fichier. Etonnant ! mais réel !
Donc on ne peut pas faire de test sur ces propriétés.
Une façon simple de suivre le chargement est donc de faire une boucle et de tester avec la méthode
onLoad() si le fichier est chargé ou non.
Pour se faire nous allon faire 2 fonctions.
- Fonction de chargement du fichier
- Fonction qui détermine les actions une fois le xml chargé.
J'ai pris pour habitude de mettre ces fonctions sur la frame 1 de mon scénario. Et de créer une frame 5 avec un label et un stop().
Une fois le fichier chargé, je vais à la frame 5.
ActionScript Code:
/**********************************
* Fonction chargerXml(fichier)
* Chargement d'un fichier Xml
* IN : fichier : nom du fichier à charger
* OUT : -
***********************************/
function chargerXml(fichier) {
XMLobjet = new XML();
XMLobjet.ignoreWhite = true;
XMLobjet.onLoad = chargementComplet;
XMLobjet.load(fichier);
}
/***********************************
* Fonction chargementComplet
* Actions à réaliser quand le fichier est chargé
* IN : -
* OUT : -
***********************************/
function chargementComplet() {
_root.gotoAndStop("LBxmlOk");
}
//Actions
chargerXml("garage.xml")
De cette façon, quand le scénario est sur l'image 5 (label LBxmlOk dans mon exemple), on est sûr que le fichier est correctement chargé. On peut donc le traiter en toute sécurité.
=>
Fonction ActionScript pour Xml
Je vais donc vous donner quelques fonctions assez pratique pour manipuler les objets Xml.
Je vous conseille, dans un but d'organisation du code, de créer un calque nommé "AS Xml". Dans la frame 1 de ce calque, mettez les fonctions Xml. D'ailleurs il serait bon de mettre les fonctions de chargement expliquées plus haut dans ce calque aussi.
- Récupération du nombre de noeud
ActionScript Code:
/***********************************
* Renvoie le nombre de noeud
* IN : XMLobj : nombre objet xml
* OUT : maxNode : nombre de noeud (type entier)
***********************************/
function getXmlMaxNode(XMLobj) {
MaxNode = XMLobj.firstChild.childNodes.length
return maxNode;
}
Utilisation :
ActionScript Code:
trace(getXmlMaxNode(XMLobjet));
//retourne 3 dans notre exemple garage.xml
- Récupérer des données suivant le nom du noeud
ActionScript Code:
/***********************************
* Récupération d'une donnée via le nom d'un noeud
* IN : XMLobj : notre objet Xml
* IN : tag : Nom du noeud (type string)
* OUT : nodes : données du noeud (type Array)
***********************************/
function getXmlValueByTag (XMLobj, tag) {
var AY;
Nodes=new Array();
AY=XMLobj.toString().split("<"+tag);
AY.shift();
for (var i=0; i<AY.length; i++) {
if (AY[i].charAt(0)==">" or AY[i].charAt(0)==" ") {
Nodes.push(AY[i].substring((AY[i].indexOf(">")+1), AY[i].indexOf("</"+tag+">")));
}
}
return Nodes;
}
Utilisation:
ActionScript Code:
trace(getXmlValueByTag(XMLobjet, "voiture"));
//retourne les 3 descriptifs des voitures.
//Etant un tableau, si l'on veut le descriptif de la premiere voiture, on fera : trace(getXmlValueByTag(XMLobjet, "voiture")[0]);
- Récupérer un attribut suivant son nom et le nom du noeud
ActionScript Code:
/***********************************
* Récupération d'une donnée via le nom d'un noeud
* IN : XMLobj : notre objet Xml
* IN : tag : Nom du noeud (type string)
* IN : attr : Nom de l'attribut (type string)
* OUT : values : attribut des noeuds (type Array)
***********************************/
function getAttrValueFromXMLtag (XMLobj, tag, attr) {
var subXML, attrValue;
Values=new Array();
subXML=XMLobj.toString().split("<"+tag);
subXML.shift();
for (var i=0; i<subXML.length; i++) {
if (subXML[i].indexOf("</"+tag+">")>=0) {
subXML[i]="<"+tag+subXML[i].substring(0, subXML[i].indexOf("</"+tag+">"))+"</"+tag+">";
} else if (subXML[i].indexOf("/>")>=0) {
subXML[i]="<"+tag+subXML[i].substring(0, subXML[i].indexOf("/>"))+"/>";
} else { subXML[i]="hiba;"}
childXML=new XML(subXML[i]);
attrValue=eval("childXML.firstChild.attributes."+attr);
if (attrValue.length>0) {Values.push(attrValue);}
}
return Values;
}
Utilisation:
ActionScript Code:
trace(getAttrValueFromXMLtag (XMLobjet, "voiture", "marque"));
//retourne les 3 marques des voitures.
//Etant un tableau, si l'on veut la marque de la premiere voiture, on fera : trace(getAttrValueFromXMLtag (XMLobjet, "voiture", "marque")[0]);
Voilà, avec ces quelques fonctions, on va pouvoir faire presque tous les traitements que l'on veut sur les fichiers Xml.
Je voudrais remercier D.Kiss, pour l'élaboration des dernières fonctions. En effet, ce n'est pas la peine de réinventer la roue et de perdre du temps de développement, alors que des fonctions existe déjà, en tout cas le squelette, à vous par la suite d'optimiser, de la mettre à votre sauce.
Bon code à tous et joyeux noel....
@+