XML и FLASH: подводные камни
www.flasher.ru
{author.username}
В статье рассказывается о проблемах, с которыми вы можете столкнуться при применении связки xml + flash. Я постараюсь осветить наиболее популярные проблемы и расскажу о их решении. Любые комментарии по теме будут с радостью и интересом приняты на http://forum.itx.ru или на blade(at)itx(dot)ru. //весь код тестировался на Macromedia Flash 7.0.1 b46-a, as-v1.0
Как известно чтобы меньше времени тратить на исправление ошибок нужно эти самые ошибки не допускать =) ну или как говориться учится на чужих ошибках, вот этим и займёмся. Большинство ошибок в своём корне это просто невнимательность, неосторожность или необдуманность принимаемых решений, так что прежде чем что-то сделать, нужно подумать о последствиях сделанного, так, например когда вы создаёте xml объект и загружаете в него xml файл для дальнейшего использования, нередко возникает вопрос: "... а почему же xml не загрузился?". На него нельзя ответить однозначно, так как всё зависит от начальных условий. В первую очередь проверьте правильность имени файла загружаемого вами:
xmlObject = new XML(); xmlObject.load("xmlfile.xml");
если вы допустили ошибку в написании имени то исправьте его, так же следует обратить внимание на регистр букв используемых в имени файла, так как для некоторых файловых систем (напр. ext3, ext2) регистр букв имеет значение; таким образом, XmlFile.xml и xmlfile.xml это 2 разных файла. Следующей причиной может стать не существование самого xml файла. Далее вы можете столкнуться с тем что когда вы отлаживали флешку на локальной машине всё грузилось, а когда залили её в инет то xml грузится, перестал; тут всё очевидно - вам нужно написать прелоадер для xml. Я приведу пример простенького прелоадера который помимо xml ещё и следит за загрузкой самого swf:
Чтобы приготовить наш прелоадер нам нужно: * Создать новый фильм * Создать в нём 2 сцены (insert->scene) * В первой сцене мы расположим то что нужно загрузить а во второй всё это обработаем. * Далее в 1 кадре 1 сцены (обзовем её preloader) пишем такой код: myxml = new XML(); myxml.load("xmlfile.xml"); * Затем создадим мувиклип и в нём сделаем 3 кадра, в 1 кадре разместим следуюший код: _root.stop(); var percents = 0.0; * Во 2 кадре напишим такой экшн: if (_root.getBytesLoaded() == _root.getBytesTotal()) { percents = percents+5.0; if (percents>100.0) { percents = 100.0; } } else { percents = Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100.0); } * Всё это стандартные участки кода для простейшего прелоадера, их описания можно найти в многочисленных мануалах. И наконец 3 кадр заполняем кодом: if (percents<100.0 // _root.myxml.loaded == false) { gotoAndPlay(2); } else { _visible = false; _root.play(); stop(); } Вот и готов наш прелоадер, принцип работы простой: всё как обычно за исключением 3 кадра там мы просто в условии добавляем параметр. И таким образом у нас получается если(проценты < 100 ИЛИ xml-файл не загружен) { ждём; }. Думаю, как поступить, если у вас не одни xml файл понятно :)
Ещё к проблемам загрузки внешних данных (не только xml) можно отнести такой любопытный факт: когда ваши файлы храняться в директории с именем cgi или cgi-bin то (!) флеш не хочет их загружать! Думаю это связано с внутренними механизмами зашиты flash (подробней об этом можно узнать из книги Колина Мука "ActionScript - справочник по языку"), так что лучше во избежание конфликтов размещать свои файлы в директориях с другими именами (я например даю имя директории в зависимости от того, какой внешний источник применяется).
Ну вот наконец-то мы загрузили наш xml, чтобы удостовериться в этом как говорится воочию проделаем такие нехитрые действия: * Зайдите в параметры экспортирования (file->publish settings или Ctrl+Shift+F12) и на вкладке Format в поле Type поставьте флажок рядом с полем Flash, а все остальные уберите и нажмите на кнопку OK. * Далее нажмите F12 (или любую другую кнопку настроенную у вас на экспортирование) и мы переместимся в отдельное окно где выполняется наш флеш фильм. * И последним нашим действием будет вызов меню Debug->List Variables (или Ctrl+alt+V), появится окно Output в котором будут содержаться все переменные как либо фигурировавшие в этом фильме; из всего многообразия вам нужно будет выбрать строку где написано имя вашего xml объекта, например:
OutPut
Variable _level0.myxml.myxml = [object #0] {
}
Когда мы убедимся что, всё загружено и работает, то настало время приступить к обработке данных xml. Вот тут то и начинаются многочисленные проблемы. Ну, во-первых, нужно проверить правильно ли вы составили xml файл или нет (о стандарте xml можно найти информацию в этой статье http://itx.ru/articles/xml-data-control.html), если всё правильно то имеет смысл искать ошибку в строке обращения (так называемый xml путь). Путь обращения зависит от уровня вложения узлов xml, приведу пример обращения к такому xml:
ActionScript один из вариантов реализации:
var info = xmlObject.firstChild.firstChild.attributes.param;
info - переменная, в которую будет записано значение xmlObject - xml обьект .firstChild - элемент .firstChild.firstChild - элемент .firstChild.firstChild.attributes.param - элемент value.
Если у вас присутствует большое количество элементов обращаться к ним по одному не удобно и громоздко, по этому напишем переборщик элементов:
for (var i = 0; i myArray[i] = xmlObject.firstChild.childNodes[i].attributes.param; }
Из кода видно, что каждому элементу массива myArray начиная с 0 будет присвоено значение параметра param из каждого узла.
<ХМЛ> <УЗЕЛ_1 param="ЗНАЧЕНИЕ"/> <УЗЕЛ_2 param="ЗНАЧЕНИЕ"/> <УЗЕЛ_3 param="ЗНАЧЕНИЕ"/> <УЗЕЛ_4 param="ЗНАЧЕНИЕ"/> <УЗЕЛ_5 param="ЗНАЧЕНИЕ"/> <УЗЕЛ_6 param="ЗНАЧЕНИЕ"/> <УЗЕЛ_7 param="ЗНАЧЕНИЕ"/> <УЗЕЛ_N param="ЗНАЧЕНИЕ"/>
xmlObject.firstChild.childNodes.length = 7 myArray[0] = ЗНАЧЕНИЕ myArray[1] = ЗНАЧЕНИЕ myArray[2] = ЗНАЧЕНИЕ myArray[3] = ЗНАЧЕНИЕ myArray[4] = ЗНАЧЕНИЕ myArray[5] = ЗНАЧЕНИЕ myArray[6] = ЗНАЧЕНИЕ myArray[7] = ЗНАЧЕНИЕ
Ну вот мы и справились с возникшими проблемами, но это далеко не всё что может помешать вам в достижении заветной цели. Так например в разных версиях flash player разная кодировка файла xml даёт совершенно непредсказуемые результаты обработки содержимого, на основе собственных наблюдения могу сказать, что flash player версии 1-5 хорошо работает с внешними данными поступающими в кодировке UTF-8, а flash player 6 и выше, предпочтительней работает с кодировкой UNICODE, в этом есть свои минусы и плюсы (в прочем, как и везде), вот, например когда я применял файлы в кодировке UTF-8 они читались многими старыми плеерами без проблем и отображались в браузерах, но русская буква "Я" никак не хотела отображаться, но с приходом UNICODE ситуация круто изменилась.
Заключение.
Если вы сталкиваетесь, с какими либо проблемами не в коем случае не опускайте руки, а старайтесь придумать наиболее оптимальное, оригинальное, быстрое и простое решение, ну и конечно не забудьте поделиться им с другими. Обращаясь к основам программирования могу сказать, что если проблема не имеет своего решения (или решение сложно реализуемо) то нужно менять начальные условия.
Весёлого программирования!
|