Код отвечающий за загрузку 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']); } } } }
В результате должен получится такой трейс:
На этом все. Искренне надеюсь, что написал полезную заметку для начинающих флешеров. Совет напоследок: все xml-файлы в вашем flash-приложении должны загружаться один раз (и храниться в памяти), так как это достаточно ресурсоёмкая процедура.
Комментарии
Добрый день, у меня возник вопрос вы не подскажете как запустить парсер во вложеном кадре.. мне надо на каждую страницу флеш сайта подгружать свой xml, это возможно?
А так же забыл спросить как сделать вывод в текстовое поле.. я в этом деле новичок =)))
Спасибо!
Отправить комментарий