Russian version
English version
ОБ АЛЬЯНСЕ | НАШИ УСЛУГИ | КАТАЛОГ РЕШЕНИЙ | ИНФОРМАЦИОННЫЙ ЦЕНТР | СТАНЬТЕ СПОНСОРАМИ SILICON TAIGA | ISDEF | КНИГИ И CD | ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ | УПРАВЛЕНИЕ КАЧЕСТВОМ | РОССИЙСКИЕ ТЕХНОЛОГИИ | НАНОТЕХНОЛОГИИ | ЮРИДИЧЕСКАЯ ПОДДЕРЖКА | АНАЛИТИКА | КАРТА САЙТА | КОНТАКТЫ
 
Программное обеспечение
 
Для зарегистрированных пользователей
 
РАССЫЛКИ НОВОСТЕЙ
IT-Новости
Новости компаний
Российские технологии
Новости ВПК
Нанотехнологии
 
Поиск по статьям
 
RSS-лента
Подписаться
Графика и изображения

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
ситуация круто изменилась.

Заключение.

Если вы сталкиваетесь, с какими либо проблемами не в коем случае не опускайте руки, а старайтесь придумать наиболее
оптимальное, оригинальное, быстрое и простое решение, ну и конечно не забудьте поделиться им с другими. Обращаясь к основам
программирования могу сказать, что если проблема не имеет своего решения (или решение сложно реализуемо) то нужно менять
начальные условия.

Весёлого программирования!


  Рекомендовать страницу   Обсудить материал Написать редактору  
  Распечатать страницу
 
  Дата публикации: 01.06.2006  

ОБ АЛЬЯНСЕ | НАШИ УСЛУГИ | КАТАЛОГ РЕШЕНИЙ | ИНФОРМАЦИОННЫЙ ЦЕНТР | СТАНЬТЕ СПОНСОРАМИ SILICON TAIGA | ISDEF | КНИГИ И CD | ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ | УПРАВЛЕНИЕ КАЧЕСТВОМ | РОССИЙСКИЕ ТЕХНОЛОГИИ | НАНОТЕХНОЛОГИИ | ЮРИДИЧЕСКАЯ ПОДДЕРЖКА | АНАЛИТИКА | КАРТА САЙТА | КОНТАКТЫ

Дизайн и поддержка: Silicon Taiga   Обратиться по техническим вопросам  
Rambler's Top100 Rambler's Top100