XML - учебник по Macromedia flash MXXML - это самая современная технология, на которой во многом основывается .Net Framework. Flash не прошел мимо и тоже имеет с ней совместимость. Хотя и возникают некоторые трудности. Какие?

XML и FLASH: подводные камни

В статье рассказывается о проблемах, с которыми вы можете столкнуться при применении связки 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-r00ts><
<contact_1 topic="mail:" text="blade@blade.net.co.nr" link="mailto:blade@blade.net.co.nr" />
<contact_2 topic="icq:" link="" text="5554733" />
<contact_3 topic="tel:" text="02" link="" />
</xml-r00ts>}

Когда мы убедимся что, всё загружено и работает, то настало время приступить к обработке данных xml.
Вот тут то и начинаются многочисленные проблемы. Ну, во-первых, нужно проверить правильно ли вы составили xml файл или нет
(о стандарте xml можно найти информацию в этой статье http://itx.ru/articles/xml-data-control.html), если всё правильно то
имеет смысл искать ошибку в строке обращения (так называемый xml путь). Путь обращения зависит от уровня вложения узлов
xml, приведу пример обращения к такому xml:

ActionScript один из вариантов реализации:
<xmldata>
<meta param="value"/>
</xmldata>
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
ситуация круто изменилась.

Заключение.

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

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

Дизайн и разработка сайта: CoreNeus
При копировании материала ссылка на источник обязательна.
Наши друзья: