Работа с xml в Actionscript



Код отвечающий за загрузку xml-документа и его обработку может быть достаточно громоздким, а также использоваться он может не один раз. Поэтому хорошим шагом с нашей стороны будет написать отдельный класс для работы с xml.

Несмотря на то, что сейчас широкими шагами завоевывает популярность actionscript 3, на момент написания статьи основным языком написания сценариев для flash-документов был второй actionscript. Поэтому о нем и будет разговор.

Итак, пусть у нас есть к примеру такой xml-файл (в кодировке unicode) с данными:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data>
<group gr_id="0" gr_name="На стороне клиента">
   <item id="0" name="Javascript">
      Безусловно, король браузерных сценариев.
   </item>
   <item id="1" name="Actionscript">
      Постоянно развивающийся язык программирования flash-приложений.
      Вместе с серверными скрипами становится удивительно мощным средством интерактивности
      и представления данных.
   </item>
</group>
<group gr_id="1" gr_name="На стороне сервера">
   <item id="2" name="PHP">
      Самый распространенный скриптовый язык программирования серверных сценариев.
   </item>
   <item id="3" name="Perl">
      Абориген программирования на стороне сервера. Несколько сложный синтаксис, но
      удивительная гибкость.
   </item>
</group>
</data>

В классе, который мы напишем, будет в простейшем случае всего две функции: конструктор и приватный обработчик xml. При создании экземпляра объекта, мы передаем параметр - адрес xml-файла. Дальше, асинхронно с остальным скриптом, происходит загрузка данных. Когда она завершается, запускается "парсер" xml, который создает массив(объект), нужного нам вида, с данными. Обратите внимание, что используется метод create() класса Delegate, чтобы функция-обработчик события загрузки вызывалась в области видимости класса myXml, а не загруженного xml-обьекта.
Смотрим класс:

import mx.utils.Delegate; // подключаем Delegate class
class MyXml {
   var file:String; // адрес/имя xml-файла
   private var _xml:XML = null; // загруженный обьект xml
   public var _data:Object = null; // результирующий объект с данными
   // конструктор класса (аргумент - имя файла):
   public function MyXml(f:String) {
      this.file = f;
      this._xml = new XML(); // создаем объект xml
      // игнорировать текстовые узлы, содержащие только пробельные символы:
      this._xml.ignoreWhite = true;
      // указываем область действия обработчику:
      this._xml.onLoad = Delegate.create(this, xmlParser);
      this._xml.load(this.file); // начинаем загрузку xml-документа
   }
   private function xmlParser(success):Void {
      // метод load возвражает булевое значение - успешность загрузки:
      if (success) {
         this._data = new Object(); // инициализируем объект для данных
         var group = this._xml.firstChild.firstChild; // берем указатель на первый элемент
         while (group) { // и в цикле пробегаем по всем остальным
            var gr_id = group.attributes.gr_id;
            this._data[gr_id] = new Object();
            this._data[gr_id]['gr_name'] = group.attributes.gr_name;
            this._data[gr_id]['items'] = new Object;
            var item = group.firstChild; // первый ребенок группы
            while(item) { // цикл по детям
               var id = item.attributes.id;
               this._data[gr_id]['items'][id] = new Object();
               this._data[gr_id]['items'][id]['name'] = item.attributes.name;
               // для текстового нода в АС2 нужно брать firstChild, а потом уже nodeValue:
               this._data[gr_id]['items'][id]['description'] = item.firstChild.nodeValue;
               item = item.nextSibling;
            }
            group = group.nextSibling;
         }
      }
      // вызываем внешнюю функцию для распечатки (читай - использования) полученных данных,
      // параметр - прошла ли загрузка успешно
      _root.printXmlData(success);
   }
}

Этот код должен находиться в файле с названием MyXml.as, который будет лежать в одной директории с документом fla. Последний мы сейчас и создадим.

import MyXml // подключаем класс
var myxml:MyXml = new MyXml('????.xml'); // создаем экземпляр - объект myxml
function printXmlData(succ:Boolean):Void {
   if (!succ) {
      trace('Возникла ошибка при попытке загрузить xml');
   }else {
      // распечатываем наш объект с помощью двух вложенных циклов
      for (var gr_id in myxml._data) {
         trace(myxml._data[gr_id]['gr_name'] + ' [' + gr_id + ']');
         for (var id in myxml._data[gr_id]['items']) {
            trace('--' + myxml._data[gr_id]['items'][id]['name'] + ' [' + id + ']');
            trace('--' + myxml._data[gr_id]['items'][id]['description']);
         }
      }
   }
}

В результате должен получится такой трейс:

Вывод trace

На этом все. Искренне надеюсь, что написал полезную заметку для начинающих флешеров. Совет напоследок: все xml-файлы в вашем flash-приложении должны загружаться один раз (и храниться в памяти), так как это достаточно ресурсоёмкая процедура.

Комментарии

Добрый день, у меня возник вопрос вы не подскажете как запустить парсер во вложеном кадре.. мне надо на каждую страницу флеш сайта подгружать свой xml, это возможно?

А так же забыл спросить как сделать вывод в текстовое поле.. я в этом деле новичок =)))

Спасибо!

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешаю теги: <a> <em> <strong> <pre> <ul> <ol> <li>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.

Подробнее о форматировании

Image CAPTCHA
Регистр символов учитывается.