PDA

View Full Version : Help me with XML loading



corneliu9d
February 26th, 2008, 04:41 AM
This is probably a common issue, but I can't figure it out. I have a class in which I load a XML file. I want to find a possibility to use the XML data so I can add some movieclips on the Stage.
This is the class:

package GalleryPackage{
import flash.net.*;
import flash.events.*;
import flash.display.Sprite;
public class xmlParser extends Sprite{
public var textData:TextLoader;
var xmlObj:XML;
public function xmlParser(url:String){
textData=new TextLoader(url);
textData.loader.addEventListener(Event.COMPLETE,co mpleteHandler);
}
private function completeHandler(e:Event){
xmlObj=new XML(textData.loader.data);
trace(xmlObj);
}
}
}
This is the textLoader class:

package GalleryPackage{
import flash.display.Sprite;
import flash.net.*;
import flash.events.*;
public class TextLoader extends Sprite {
public var entireText:String=new String();
public var loader:URLLoader=new URLLoader();
public function TextLoader(url:String) {
var URLrequest:URLRequest=new URLRequest(url);
loader.dataFormat=URLLoaderDataFormat.BINARY;
loader.load(URLrequest);
loader.addEventListener(Event.COMPLETE,completeHan dler);
}
private function completeHandler(e:Event) {
entireText=loader.data;
trace(entireText);
}
}
}My problem is that I don't know (on the Stage) when the XML has finished loading, so I can use it. I have tried using EventDispatcher, but probably I'm too noob :|.
Please give me an idea how to accomplish this.

sabee77
February 26th, 2008, 05:13 AM
Hi,
I use something like this (I'm far from an expert in AS3 and OOP, but this technique works for me):

Where I want to receive the XML data I have this code:

var myXML = new XML_import(this);
myXML.loadXML("xmlPath.xml");

public function XMLloaded(xml:XML):void{
trace("XML LOADED");
trace(xml);
}

And then I have a XML_import class:

package as_scripts{
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.display.DisplayObject;
import flash.events.Event;

public class XML_import {
var myParent:DisplayObject;

public function XML_import(ref:DisplayObject) {
this.myParent = ref;
}
private function loadXML(url:String):void {
var vUrlRequest:URLRequest = new URLRequest(url);
var myLoader = new URLLoader(vUrlRequest);
myLoader.addEventListener(Event.COMPLETE, XMLloaded);
}
private function XMLloaded(event:Event):void {
myParent.XMLloaded(XML(event.target.data));
}
}
}


Hope it can help you.
Regards.

corneliu9d
February 26th, 2008, 10:19 AM
Thanks, it is exactly what I wanted.

dail
February 26th, 2008, 01:58 PM
Rather than adding in dependencies to parent objects etc you can use events to notify you of when your XML has loaded. Here is a class that will dispatch an event when an XML load operation has finished. You then listen for that event and use the XML data as you see fit.



/*SIMPLE XML PARSING CLASS

SAMPLE USEAGE

In .fla
var myloadXml:loadXml = new loadXml("images.xml");
myloadXml.addEventListener("xmlParsed", callbackHandler);



*/

package {
import flash.events.*;
import flash.net.URLRequest;
import flash.net.URLLoader;

public class loadXml extends EventDispatcher {
public var myXML:XML;
private var myXLoader:URLLoader;
private var myXMLURL:URLRequest;
private var XML_URL:String;

public function loadXml(url:String) {
myXML = new XML();
XML_URL = url;
myXMLURL = new URLRequest(XML_URL);
myXLoader = new URLLoader(myXMLURL);
myXLoader.addEventListener(Event.COMPLETE, completeHandler);
myXLoader.addEventListener(IOErrorEvent.IO_ERROR, handleError);
}
private function completeHandler(e:Event):void {
myXML = XML(e.target.data);
dispatchEvent(new Event("xmlParsed"));

}
private function handleError(event:IOErrorEvent):void {
trace("Error loading XML");
}
}
}


Then handle the event like so;



var contentXML:XML = new XML();
var getXML=new loadXml("content.xml");
getXML.addEventListener("xmlParsed",xmlLoaded);

function xmlLoaded(evt:Event):void {
contentXML=getXML.myXML;

}