This class, that is just a translation of a simple set of function written for Flash MX, translates any kind of XML document into a readable Flash Object. This could be the core for projects XML oriented..
in fact i work often on xml based projects…
/**
* @class it.sephiroth.XML2Object
* @author Alessandro Crugnola
* @version 1.0
* @description return an object with the content of the XML translated
* NOTE: a node name with "-" will be replaced with "_" for flash compatibility.
* for example will become FIRST_NAME
* If a node has more than 1 child with the same name, an array is created with the children contents
* The object created will have this structure:
* - obj {
* nodeName : {
* attributes : an object containing the node attributes
* data : an object containing the node contents
* }
* @usage data = new XML2Object().parseXML( anXML);
*/
//import utils.string
class it.sephiroth.XML2Object extends XML {
private var oResult:Object = new Object ();
private var oXML:XML;
/**
* @method get xml
* @description return the xml passed in the parseXML method
* @usage theXML = XML2Object.xml
*/
public function get xml():XML{
return oXML
}
/**
* @method public parseXML
* @description return the parsed Object
* @usage XML2Object.parseXML( theXMLtoParse );
* @param sFile XML
* @returns an Object with the contents of the passed XML
*/
public function parseXML (sFile:XML):Object {
this.oResult = new Object ();
this.oXML = sFile;
this.oResult = this.translateXML();
return this.oResult;
}
/**
* @method private translateXML
* @description core of the XML2Object class
*/
private function translateXML (from, path, name, position) {
var xmlName:String;
var nodes, node, old_path;
if (path == undefined) {
path = this;
name = "oResult";
}
path = path[name];
if (from == undefined) {
from = new XML (this.xml);
from.ignoreWhite = true;
}
if (from.hasChildNodes ()) {
nodes = from.childNodes;
if (position != undefined) {
var old_path = path;
path = path[position];
}
while (nodes.length > 0) {
node = nodes.shift ();
xmlName = node.nodeName.split("-").join("_");
if (xmlName != undefined) {
var __obj__ = new Object ();
__obj__.attributes = node.attributes;
__obj__.data = node.firstChild.nodeValue;
if (position != undefined) {
var old_path = path;
}
if (path[xmlName] != undefined) {
if (path[xmlName].__proto__ == Array.prototype) {
path[xmlName].push (__obj__);
name = node.nodeName;
position = path[xmlName].length - 1;
} else {
var copyObj = path[xmlName];
path[xmlName] = new Array ();
path[xmlName].push (copyObj);
path[xmlName].push (__obj__);
name = xmlName;
position = path[xmlName].length - 1;
}
} else {
path[xmlName] = __obj__;
name = xmlName;
position = undefined;
}
}
if (node.hasChildNodes ()) {
this.translateXML (node, path, name, position);
}
}
}
return this.oResult;
}
}
An Example usage with this file:
http://www.sephiroth.it/tutorials/flashPHP/indice.xml
import it.sephiroth.XML2Object;
var oXML:XML = new XML ();
var sXML:String = "indice.xml";
oXML.ignoreWhite = true;
function xmlLoaded (success:Boolean) {
if (success) {
trace (success);
_root.ObjFromXML = new XML2Object ().parseXML (this);
delete this
}
}
oXML.onLoad = xmlLoaded;
oXML.load (sXML);