вот еще.
по поводу обращения по имени - я когда то давно писал класс один для этого дела. если разберетесь как им пользоваться, то на здоровье:

Код AS1/AS2:
class XML2Array {
static public var COMPLETE:Number = 0;
static public var ERROR:Number = 1;
private var onComplete:Function;
private var onError:Function;
private var xml:XML;
private var sorting:Boolean;
public function XML2Array($sorting:Boolean) {
sorting = $sorting;
}
public function load(str:String) {
var t:XML2Array = this;
xml = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(ok:Boolean):Void {
if (ok) {
if (this.status) {
t.onError('Неправильный формат данных (' + this.status + ')');
}else {
t.onComplete(t.parseXML(this));
}
}else {
t.onError('Файл не найден');
}
}
xml.load(str);
}
public function convert(str:String) {
xml = new XML(str);
xml.ignoreWhite = true;
if (xml.status) {
onError('Неправильный формат данных (' + xml.status + ')');
}else {
onComplete(parseXML(xml));
}
}
public function addEventListener(p_event:Number, p_function:Function):Void {
switch (p_event) {
case XML2Array.COMPLETE:
this.onComplete = p_function;
break;
case XML2Array.ERROR:
this.onError = p_function;
break;
default:
break;
}
}
private function parseXML(p_xml:XML):Array {
var arr:Array = [];
// parse attributes
for (var p:String in p_xml.attributes) {
arr[p] = p_xml.attributes[p];
}
// parse nodeValue
var nv:String = p_xml.childNodes[0].nodeValue;
if (nv != undefined && nv != null){
arr.value = nv;
}
// parse childs
var nameArr:Array = [];
for (var i:Number = 0; i < p_xml.childNodes.length; i++ ) {
nameArr.push(p_xml.childNodes[i].nodeName);
}
for (var i:Number = 0; i < p_xml.childNodes.length; i++ ) {
if (p_xml.childNodes[i].nodeName != null) {
if (isUnique(nameArr, p_xml.childNodes[i].nodeName)){
arr[p_xml.childNodes[i].nodeName] = parseXML(p_xml.childNodes[i]);
}else {
if (arr[p_xml.childNodes[i].nodeName] == undefined) {
arr[p_xml.childNodes[i].nodeName] = [];
}
var idArr:Array = parseXML(p_xml.childNodes[i]);
// сортировка по id
if (!sorting) { /*if (isNaN(idArr.id)){*/
arr[p_xml.childNodes[i].nodeName].push(idArr);
}else{
arr[p_xml.childNodes[i].nodeName][Number(idArr.id)] = idArr;
}
}
}
}
return arr;
}
private function isUnique(p_arr:Array, p_str:Object):Boolean {
var c:Number = 0;
for (var i:Number = 0; i < p_arr.length; i++ ) {
if (p_arr[i].toString() == p_str.toString()) {
c++;
if (c > 1) {
return false;
};
}
}
return (c == 1);
}
}