Начал изучать Flex. Хочу поделиться некоторыми наработками, которые могут пригодиться.Класс для создания древовидного объекта по XML строке.
Допустим у нас есть XML данные, полученные с удаленного хоста или еще как-нибудь. Xml может иметь смешанный тип, т.е. есть и обязательные теги (типа response), так и повторяющиеся на разных уровнях (section, id и т.д.)
Xml:
В программе удобней работать с объектом, чем с текстовыми данными, для этого служит следующий класс:
package Lib {
public class XMLTree {
private var _xml:XML = null;
private var _data:Object = new Object();
private var _maxElem:int = 500;//ограничение на число элементов
//конструктор, передается текстовый xml
public function XMLTree(_xml:String) {
this._xml = new XML(_xml); //создание объекта
this.xmlParser(this._xml, this._data);//парсинг
}
public function getData():Object {
return this._data;
}
//рекурсивный обход дерева
private function xmlParser(node, obj:Object):void {
var sObjName = "";
//по каждому ответвлению
for (var i = 0; i < node.length() && i < this._maxElem; i++) {
sObjName = node[i].name();
//если это ветка (имеет дочерей)
if(node[i].hasComplexContent()) {
//т.к. названия веток могут повторяться. Если свойство уже существует, то создается свойство с именем = имя + _ + уникальный идентификатор
if(obj[sObjName] != undefined) {
sObjName = sObjName + "_" + i;
}
//передаем ветку и текущее положение в деревянном объекте на следующий цикл рекурсии
obj[sObjName] = new Object;
this.xmlParser(node[i].children(), obj[sObjName]);
} else {
//создаем свойство с именем ветки XML объекта и текстовым значением
obj[sObjName] = node[i].text();
} //if
}//for
}//func
}//class
}//package
Следующий код создаем объект и перечисляет значения первой ветки section дерева:
var xmlObj:XMLTree = new XMLTree(sXml);
var data:Object = xmlObj.getData();
for(var o in data.response.section) {
Alert.show(data.response.section[o]);
}