вторник, 5 января 2010 г.

Flex: Построение древовидного объекта по XML данным

Начал изучать 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]);
}

4 комментария:

  1. Алексей, а вот вопрос к вам по теме Flex и XML
    Может покажется слегка банальным, но загвоздка такая -

    1. Есть XML







    2. Есть Комбобос и серверный пхп скрипт.

    3. Задача
    - получил xml настроив источник данных.
    - заполнил Именами выпадающий список комбобокса.
    - выбираю в комбобоксе Имя
    - Необходимо в некую переменную получить соответствующий имени параметр тип_ид
    - сформировать http запрос http:\\1.ru\delo=type_id (имени которое выбрано в комбобоксе).

    Прошу пример, как выбрать type_id из xml соответствующего имени и сформировать запрос.

    Flex только только открыл для себя. Перерыл кучу примеров, решения не нашел.

    ОтветитьУдалить
  2. 2. "" хмл строка. Формат соблюден.

    ОтветитьУдалить
  3. Задайте лучше этот вопрос на каком-нибудь форуме. Я уж тож подзабросил флекс.

    ОтветитьУдалить
  4. Как вы формируете источник данных для ComboBox`a? если передаёте xml в качестве dataProvider тогда [comboBox].selectedItem.@type_id.toString - это если type_id аттрибут тэга xml
    [comboBox].selectedItem.type_id.toString() - это если type_id это дочерний тэг
    если возникнут вопросы пишите на metmitnik@gmail.com.

    ОтветитьУдалить