XML and flash is something that always seemed to be more complicated than it needed to be. Then I had an idea to parse the xml nodes into actionscript as objects, that would make working with xml tons easier for me, I could just parse it once and then forget about the xml, I could refer to something with the familiar dot syntax rather than worry about firstChild and nextChild and so forth…
And then I found someone who’d already done that with XML2Object.as, here it is:
XML@Object.as Class
Actionscript Class:
- //////////////////
- // - Derived from code written by Alessandro Crugnola - http://www.sephiroth.it/file_detail.php?id=129#
- // - Refactored and documented by Phil Powell - http://www.sillydomainname.com
- // - 25 July 2006 - Added helper method to sanitize Windows line breaks.
- //////////////////
- // Convert an XML object to an object with nested properties.
- //
- // Example usage:
- //
- // import net.produxion.util.XML2Object;
- // var contentObj:Object;
- // var xml:XML = new XML();
- // var xmlLoaded = function( success:Boolean )
- // {
- // if( success )
- // {
- // contentObj = XML2Object.deserialize( this );
- // this['timeline'].play();
- // }
- // }
- //
- // xml.ignoreWhite = true;
- // xml['timeline'] = this;
- // xml.onLoad = xmlLoaded;
- // xml.load( 'some.xml' );
- //
- /////////////////
- // What do you get back?
- //
- // <content created="22-May-2006">
- // <title>My Title</title>
- // <links>
- // <heading>Here be links!</heading>
- // <link>http://somewhere.com</link>
- // <link>http://somewhere-else.com</link>
- // </links>
- // </content>
- //
- // Becomes:
- //
- // contentObj.content.title.data => "My Title"
- // contentObj.content.links.title.data => "Here be links!"
- // contentObj.content.links.link => [Array]
- // contentObj.content.links.link[0].data => "http://somewhere.com"
- // contentObj.content.attributes.created => "22-May-2006"
- /////////////////
- class XML2Object {private var _result:Object;
- private var _xml:XML;
- private var _path:Object;
- private static var xml2object:XML2Object;public function XML2Object()
- {
- this._result = new Object();
- }
- public static function deserialize( xml:XML ):Object
- {
- xml2object = new XML2Object();
- xml2object.xml = xml;
- return xml2object.nodesToProperties();
- }
- public function get xml():XML
- {
- return _xml;
- }
- public function set xml( xml:XML ):Void
- {
- this._xml = xml;
- }
- private function nodesToProperties( parent:XMLNode, path:Object, name:String, position:Number ):Object
- {
- var nodes:Array;
- var node:XMLNode;
- path == undefined ? path = this._result : path = path[name];
- if( parent == undefined) parent = XMLNode( this._xml );
- if( parent.hasChildNodes() )
- {
- nodes = parent.childNodes;
- if (position != undefined) path = path[position];
- while( nodes.length > 0 )
- {
- node = XMLNode( nodes.shift() );
- if ( node.nodeName != undefined )
- {
- var obj = new Object();
- obj.attributes = node.attributes;
- obj.data = sanitizeLineBreaks( node.firstChild.nodeValue );
- if( path[node.nodeName] != undefined )
- {
- if( path[node.nodeName].__proto__ == Array.prototype )
- {
- path[node.nodeName].push( obj );
- }
- else
- {
- var copyObj = path[node.nodeName];
- delete path[node.nodeName];
- path[node.nodeName] = new Array();
- path[node.nodeName].push( copyObj );
- path[node.nodeName].push( obj );
- }
- position = path[node.nodeName].length - 1;
- }
- else
- {
- path[node.nodeName] = obj;
- position = undefined;
- }
- name = node.nodeName;
- }
- if( node.hasChildNodes() )
- {
- this.nodesToProperties( node, path, name, position );
- }
- }
- }
- return this._result;
- }
- private function sanitizeLineBreaks( raw:String )
- {
- if( raw.indexOf( "\r\n" ) > -1 )
- {
- return raw.split( "\r\n" ).join( "\n" );
- }
- return raw;
- }
- }
Example:
Source:
Here is my example file. But since you cant really see Objects in the code on the stage, I’ve included a recursive trace function to loop through the object and print the data.
- import XML2Object;
- var xmlObject:Object;
- var xml:XML = new XML();
- var xmlLoaded = function( success:Boolean ){
- if( success ) {
- xmlObject = XML2Object.deserialize( this );
- this['timeline'].play();
- recurseTrace(xmlObject, " ");
- myTrace("\n\n")
- myTrace("xmlObject.catagories.catagory[10].name.data = "+xmlObject.catagories.catagory[10].name.data);
- }
- }
- xml.ignoreWhite = true;
- xml.onLoad = xmlLoaded;
- xml.load( 'sampleXML.xml' );
- function recurseTrace(info:Object, indent:String) {
- for (var i in info) {
- if (info[i] == null){}
- else if (typeof info[i] == "object") {
- myTrace(indent + i + " -");
- recurseTrace(info[i], indent);
- }
- else {
- myTrace(indent + i + " = " + info[i] +", ");
- }
- }
- }
- function myTrace(myLine:String){
- feedback.text += "|"+myLine;
- trace(myLine);
- }
And here’s my sample xml file: (it’s the same one I use in my Dynamic Flash Scrolling Link List files)
- <catagories>
- <catagory>
- <name>3D</name>
- <url>http://blog.circlecube.com/tag/3d/</url>
- </catagory>
- <catagory>
- <name>abstract</name>
- <url>http://blog.circlecube.com/tag/abstract/</url>
- </catagory>
- <catagory>
- <name>actionscript</name>
- <url>http://blog.circlecube.com/tag/actionscript/</url>
- </catagory>
- <catagory>
- <name>animation</name>
- <url>http://blog.circlecube.com/tag/animation/</url>
- </catagory>
- <catagory>
- <name>blog</name>
- <url>http://blog.circlecube.com/tag/blog/</url>
- </catagory>
- <catagory>
- <name>book</name>
- <url>http://blog.circlecube.com/tag/book/</url>
- </catagory>
- <catagory>
- <name>CG</name>
- <url>http://blog.circlecube.com/tag/cg/</url>
- </catagory>
- <catagory>
- <name>charcoal</name>
- <url>http://blog.circlecube.com/tag/charcoal/</url>
- </catagory>
- <catagory>
- <name>circle cube</name>
- <url>http://blog.circlecube.com/tag/circle-cube/</url>
- </catagory>
- <catagory>
- <name>collage</name>
- <url>http://blog.circlecube.com/tag/collage/</url>
- </catagory>
- <catagory>
- <name>color</name>
- <url>http://blog.circlecube.com/tag/color/</url>
- </catagory>
- <catagory>
- <name>css</name>
- <url>http://blog.circlecube.com/tag/css/</url>
- </catagory>
- <catagory>
- <name>drawing</name>
- <url>http://blog.circlecube.com/tag/drawing/</url>
- </catagory>
- <catagory>
- <name>dreamweaver</name>
- <url>http://blog.circlecube.com/tag/dreamweaver/</url>
- </catagory>
- <catagory>
- <name>experiment</name>
- <url>http://blog.circlecube.com/tag/experiment/</url>
- </catagory>
- <catagory>
- <name>film</name>
- <url>http://blog.circlecube.com/tag/film/</url>
- </catagory>
- <catagory>
- <name>final cut</name>
- <url>http://blog.circlecube.com/tag/final-cut/</url>
- </catagory>
- <catagory>
- <name>flash</name>
- <url>http://blog.circlecube.com/tag/flash/</url>
- </catagory>
- </catagories>
Download:
Here’s the XML2Object.as class: XML2Object.as class
Here’s a zip containing everything and the working example: xmlToObject.zip


