/**
* @class it.sephiroth.XML2Object
* @author Alessandro Crugnola
* @version 1.0
* @description return an object with the content of the XML translated
* 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);
*/
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 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 ();
if (node.nodeName != undefined) {
var __obj__ = new Object ();
__obj__.attributes = node.attributes;
__obj__.data = node.firstChild.nodeValue;
if (position != undefined) {
var old_path = path;
}
if (path[node.nodeName] != undefined) {
if (path[node.nodeName].__proto__ == Array.prototype) {
path[node.nodeName].push (__obj__);
name = node.nodeName;
position = path[node.nodeName].length - 1;
} else {
var copyObj = path[node.nodeName];
path[node.nodeName] = new Array ();
path[node.nodeName].push (copyObj);
path[node.nodeName].push (__obj__);
name = node.nodeName;
position = path[node.nodeName].length - 1;
}
} else {
path[node.nodeName] = __obj__;
name = node.nodeName;
position = undefined;
}
}
if (node.hasChildNodes ()) {
this.translateXML (node, path, name, position);
}
}
}
return this.oResult;
}
}