Originariamente inviato da Kaneda81
Guarda io di solito uso una classe per fare tutti i caricamenti xml, unica cosa li carico solo, mentre il parsing lo faccio dentro la main.
Questo perchè, a seconda dell'xml, il codice può essere diverso.
In generale sono d'accordo, anche io utilizzo una classe esterna con un riferimento, è più naturale quando si usa un approccio oop.
Comunque, rispondendo alla domanda, così com'è, possiamo avere la classe che carica l'xml scritta in questo modo:
Codice PHP:
package {
import flash.events.ErrorEvent;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.geom.Point;
import flash.net.URLLoader;
import flash.net.URLRequest;
public class XMLLoader extends EventDispatcher {
private var L:URLLoader;
private var A:Array;
public function XMLLoader (xml_url:String = null):void {
if (xml_url) init(xml_url);
}
public function load (s:String):void {
init(s);
}
private function init (s:String):void {
A = [];
L = new URLLoader(new URLRequest(s));
L.addEventListener(Event.COMPLETE, complete);
L.addEventListener(IOErrorEvent.IO_ERROR, io_error);
}
private function complete (evt:Event = null):void {
var xml:XML = new XML(evt.target.data);
parse(xml);
dispatchEvent(evt);
}
private function io_error (evt:IOErrorEvent = null):void {
dispatchEvent(evt);
}
private function parse (xml:XML):void {
for (var i:uint=0; i<xml.percorso.length(); i++) {
A.push({
id:xml..@id[i],
partenza:xml..partenza[i],
partenza_coords:new Point(xml..partenza[i].@coords.split(",")[0], xml..partenza[i].@coords.split(",")[1]),
arrivi: [xml.percorso[i].arrivo[0], xml.percorso[i].arrivo[1], xml.percorso[i].arrivo[2]],
arrivi_coords:[
new Point(xml.percorso[i].arrivo[0].@coords.split(",")[0], xml.percorso[i].arrivo[0].@coords.split(",")[1]),
new Point(xml.percorso[i].arrivo[1].@coords.split(",")[0], xml.percorso[i].arrivo[1].@coords.split(",")[1]),
new Point(xml.percorso[i].arrivo[2].@coords.split(",")[0], xml.percorso[i].arrivo[2].@coords.split(",")[1])
],
arrivi_h:[
xml.percorso[i].arrivo[0].@h,
xml.percorso[i].arrivo[1].@h,
xml.percorso[i].arrivo[2].@h
],
arrivi_h_m:[
xml.percorso[i].arrivo[0].@h_m,
xml.percorso[i].arrivo[1].@h_m,
xml.percorso[i].arrivo[2].@h_m
],
arrivi_h_t:[
xml.percorso[i].arrivo[0].@h_t,
xml.percorso[i].arrivo[1].@h_t,
xml.percorso[i].arrivo[2].@h_t
]
});
}
}
public function get data ():Array {
return A;
}
}
}
Mentre il codice as per testare il parsing può assomigliare a questo:
Codice PHP:
var parser:XMLLoader = new XMLLoader("data/percorsi.xml");
parser.addEventListener(Event.COMPLETE, complete);
function complete (evt:Event = null):void {
var el:Array = evt.target.data;
el.forEach(callback);
}
function callback (e:*, i:uint, a:Array):void {
trace(e.id);
trace(e.partenza);
trace(e.partenza_coords);
trace(e.arrivi);
trace(e.arrivi_coords);
trace(e.arrivi_h);
trace(e.arrivi_h_m);
trace(e.arrivi_h_t);
}
Come puoi vedere la proprietà "data" dell'xmlloader è l'array che contiene una serie di oggetti con le proprietà che fanno parte di ogni nodo dell'xml.