Loading XML Data Using AS3
Thanks to the Adobe Gods for making the lives of so many Flash developers much less complicated when dealing with XML Data. XML and AS2 just did not get along very well. It was one of those situations where there was a love/hate relationship.
Love was there when you’ve hacked yourself an impressive solution that simple works well, but that hate returns when it was time to change the XML structure. Going back and rerouting the paths to the correct XML nodes was just painful.
It’s funny because I did not foresee a brighter day for dealing with Flash and XML data. Those brighter days have now finally come with the newly added XML classes that will basically do all the work for you.
The XML libraries have been completely overhauled in AS3. These new changes provide a much more seamless XML integration that is based on the web standards of E4X.
What is E4X?
E4X (ECMA for XML) is the current World Wide Web Consortium standard for reading and writing XML documents, and greatly reduces the amount of code and hoop-jumping required to communicate with XML. It allows you to treat XML objects like any other object with familiar dot syntax, and provides additional shortcuts for traversing XML trees.
By providing the support for E4X, the amount of code and maneuvering in and out of XML nodes is greatly reduced and easier to understand.
In the examples below, I will first demonstrate the AS2 integration of loading XML data followed by the AS3 comparison.
Loading XML data using AS2
//Load XML Data
function loadXML(loaded) {
if (loaded) {
var xmlNode=this.firstChild;
var total:Number=xmlNode.childNodes.length;
//Creating the arrays needed for storing off the XML data
var bookInfo:Array=new Array(total);
var isbnNum:Array=new Array(total);
var subNum:Array=new Array(total);
for (var i:Number=0; i<total; i++) {
//Storing off the ISBN values into an array
isbnNum[i]=xmlNode.childNodes[i].attributes.isbn;
//Storing off each parent's(book) children count
subNum[i]=xmlNode.childNodes[i].childNodes.length;
bookInfo[i]=new Array(subNum[i]);
trace("ISBN = "+isbnNum[i]);
trace("Book Info:");
for (var j:Number=0; j<subNum[i]; j++) {
//Store the book info of all the books into a 2D Array
//Thie is the path to the desired xml nodes
bookInfo[i][j]=xmlNode.childNodes[i].childNodes[j].firstChild.nodeValue;
trace(bookInfo[i][j]);
}
}
} else {
trace("Error loading XML");
}
}
//Required syntax
xmlData=new XML ;
xmlData.ignoreWhite=true;
xmlData.onLoad=loadXML;
xmlData.load("book-list.xml");
stop();
Loading XML data using AS3
var xmlLoader:URLLoader=new URLLoader ;
var xmlData:XML=new XML ;
//Adding an event listener to notify when loading is completed
xmlLoader.addEventListener(Event.COMPLETE,LoadXML);
//Load the XML file
xmlLoader.load(new URLRequest("book-list.xml"));
function LoadXML(e:Event):void {
xmlData=new XML(e.target.data);
ParseBooks(xmlData);
}
function ParseBooks(bookInput:XML):void {
//Creating an xml list that will store the book info
var books:XMLList=bookInput.book.children();
//Creating a xml list that will store the book's ISBN number
var bookAttributes:XMLList=bookInput.book.attributes();
//Extract the data from the populated XML lists
for (var j:int=0; j<bookAttributes.length(); j++) {
var bookISBNNum:XML=bookAttributes[i];
trace("ISBN = "+bookISBNNum);
}
for (var i:int=0; i<books.length(); i++) {
var bookInfo:XML=books[i];
trace(bookInfo);
}
}
What’s the difference?
The Use of XML Lists
A XML List is a list use to store specific XML nodes or attributes. The way I see it XML Lists are basically arrays formatted for dealing with XML data. This eliminates the need of creating all multiple arrays to store your data for further use – the XML List will do it all for you. If we wanted to, we can save off the an individual list for the author and book title by simply creating an XML List and filtering the specific node data. See code below.
Returning any or all of the XML data
Filtering and storing off any or all XML data becomes a more natural process.
//This xml list stores all of each book's data var bookChildren:XMLList = bookInput.Book.children(); //This xml list will only store the author's info var authorList:XMLList=bookInput.book.author; //This xml list will only store the title's info var titleList:XMLList=bookInput.book.title;
No need to define ignoreWhite to true
WithinAS3 there is not a need to define the ignoreWhite state to true. By default this is automatically set to true. Makes sense right!
Overall, you can see that loading XML data into Flash is as seamless as can be. No more headaches on trying to get your XML file to work for you. There’s more to the new XML classes than what you see on this page and I plan to touch on more of it in the next few days. If you are in need of additional resources, check out the ones below.
Additional Resources:
Download Source
I hope this helps in your migration over into AS3. If there is something in particular you want to add or see with the Moving From AS2 to AS3 series, feel free to contact me via the contact page.















No comments
Filtering XML Data Using AS3 | Flash Speaks Actionscript
08.25.2010
[...] filter XML node values but you can do the same to XML Attributes values. In the a previous post , Loading XML Data, I created and included an attribute labeled “ISBN” which would be available within [...]
There are no trackbacks to display at this time.