ActionScript 3.0: загрузка и обработка XML-файлов

XML - это популярный текстовый формат, который широко используется для хранения и передачи данных. С этим форматом умеют работать все современные языки программирования, не исключая и ActionScript (как AS 3.0, так и AS 2.0). Но сегодня мы рассмотрим только самые основы работы с XML и только в языке ActionScript 3.0.

Для начала давайте создадим простой внешний XML-файл, который и будем использовать в дальнейшем...

Код XML:

<?xml version="1.0" encoding="utf-8"?> <doc> <mywidth>300</mywidth> <myheight>200</myheight> <mycolor>0xff0000</mycolor> <mytext>мой текст</mytext> </doc>

Напечатайте приведённый выше текст в любом имеющемся у вас текстовом редакторе (Блокнот, Notepad++, ... ), а затем сохраните его как файл «myxml.xml». Сохраняйте файл только в кодировке utf-8! Эта кодировка обязательна при работе с внешними текстовыми файлами во Flash.

Что дальше?

А дальше нам надо загрузить XML-файл в наше флеш-приложение. Без этого дальнейшая работа с xml-данными просто невозможна. Простой способ загрузки внешнего текстового файла выглядит следующим образом...

Код ActionScript 3.0:

import flash.net.*; import flash.events.*; var loader:URLLoader = new URLLoader(); loader.load(new URLRequest("myxml.xml")); loader.addEventListener(Event.COMPLETE,onComplete); function onComplete(event:Event):void { trace(event.target.data) }

Как видите, всё невероятно просто.

Но ещё желательно отлавливать ошибки, которые могут возникнуть при загрузке файла...

Код ActionScript 3.0:

import flash.net.*; import flash.events.*; var loader:URLLoader = new URLLoader(); loader.load(new URLRequest("myxml.xml")); loader.addEventListener(Event.COMPLETE,onComplete); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); loader.addEventListener(IOErrorEvent.IO_ERROR,ioError); function onComplete(event:Event):void { trace(event.target.data) } function securityError(event:SecurityErrorEvent):void { trace("SecurityErrorEvent"); } function ioError(event:IOErrorEvent):void { trace("IOErrorEvent"); }

Так, теперь мы умеем загружать внешние XML-файлы с данными. Но этого нам мало. Нам надо научиться извлекать нужные нам данные из загруженного документа. Для нашего XML-документа это делается так...

Код ActionScript 3.0:

import flash.net.*; import flash.events.*; var loader:URLLoader = new URLLoader(); loader.load(new URLRequest("myxml.xml")); loader.addEventListener(Event.COMPLETE,onComplete); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); loader.addEventListener(IOErrorEvent.IO_ERROR,ioError); function onComplete(event:Event):void { var myxml:XML = XML(event.target.data); trace(myxml.mywidth.text()) trace(myxml.myheight.text()) trace(myxml.mycolor.text()) trace(myxml.mytext.text()) } function securityError(event:SecurityErrorEvent):void { trace("SecurityErrorEvent"); } function ioError(event:IOErrorEvent):void { trace("IOErrorEvent"); }

Если проверить приведённый выше пример, то будут выведены те значения, которые у нас указаны в файле myxml.xml. Кажется, что всё сработало. Но есть одно «НО». Дело в том, что из нашего xml-файла мы загружаем как строковые значения ("мой текст"), так и числовые значения (300, 200 и 0xff0000). Но, на самом-то деле, все эти данные наше flash-приложение загрузило как строковые данные. А если мы хотим загруженные числовые данные использовать именно как числовые, то должны явно это указать...

Код ActionScript 3.0:

import flash.net.*; import flash.events.*; var loader:URLLoader = new URLLoader(); loader.load(new URLRequest("myxml.xml")); loader.addEventListener(Event.COMPLETE,onComplete); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); loader.addEventListener(IOErrorEvent.IO_ERROR,ioError); function onComplete(event:Event):void { var myxml:XML = XML(event.target.data); var mywidth:uint = parseInt(myxml.mywidth.text(),10); var myheight:uint = parseInt(myxml.myheight.text(),10); var mycolor:uint = parseInt(myxml.mycolor.text(),16); var mytext:String = myxml.mytext.text(); } function securityError(event:SecurityErrorEvent):void { trace("SecurityErrorEvent"); } function ioError(event:IOErrorEvent):void { trace("IOErrorEvent"); }

Всё! Теперь в нашем распоряжении несколько переменных, которые мы загрузили из внешнего файла. Эти переменные можно использовать в нашем flash-проекте. Например, так...

Код ActionScript 3.0:

import flash.net.*; import flash.events.*; import flash.display.Sprite; import flash.text.TextField; var loader:URLLoader = new URLLoader(); loader.load(new URLRequest("myxml.xml")); loader.addEventListener(Event.COMPLETE,onComplete); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); loader.addEventListener(IOErrorEvent.IO_ERROR,ioError); function onComplete(event:Event):void { var myxml:XML = XML(event.target.data); var mywidth:uint = parseInt(myxml.mywidth.text(),10); var myheight:uint = parseInt(myxml.myheight.text(),10); var mycolor:uint = parseInt(myxml.mycolor.text(),16); var mytext:String = myxml.mytext.text(); var sprite:Sprite = new Sprite(); sprite.graphics.beginFill(mycolor,1); sprite.graphics.drawRect(0,0,mywidth,myheight); sprite.graphics.endFill(); addChild(sprite); sprite.x = 50; sprite.y = 50; var txtField:TextField = new TextField(); txtField.width = mywidth; txtField.height = myheight; txtField.multiline = true; txtField.wordWrap = true; txtField.text = mytext; sprite.addChild(txtField); } function securityError(event:SecurityErrorEvent):void { trace("SecurityErrorEvent"); } function ioError(event:IOErrorEvent):void { trace("IOErrorEvent"); }

Результат:

В приведённом выше примере мы загружали простой текст ("мой текст"). Но часто требуется загрузить не просто текст, а текст, отформатированный с помощью HTML-тегов (про форматирование текста с помощью html-тегов смотри статьи htmlTextEditor: HTML-форматирование и Flash, ActionScript: создание ссылок в текстовых полях, Загрузка внешней таблицы стилей в flash-приложение, CSS-стили для текстовых полей flash-приложений, ActionScript, тег LI и создание маркированных списков, TabStops и простой способ вывода табличных данных в ActionScript и другие).

Как быть? Ведь использовать html-теги внутри xml-файла нельзя.

Можно, но только отформатированный с помощью HTML текст надо помещать в специальный блок CDATA. Приведу пример...

дальнейшем...

Код XML:

<?xml version="1.0" encoding="utf-8"?> <doc> <mywidth>300</mywidth> <myheight>200</myheight> <mycolor>0xff0000</mycolor> <mytext><![CDATA[<font color="#ffffff" size="18">В этом <u>тексте</u> я использовал <b>HTML</b>-теги!</font>]]></mytext> </doc>

Кроме этого, надо внести одно изменение в наше flash-приложение...

Код ActionScript 3.0:

import flash.net.*; import flash.events.*; import flash.display.Sprite; import flash.text.TextField; var loader:URLLoader = new URLLoader(); loader.load(new URLRequest("myxml.xml")); loader.addEventListener(Event.COMPLETE,onComplete); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); loader.addEventListener(IOErrorEvent.IO_ERROR,ioError); function onComplete(event:Event):void { var myxml:XML = XML(event.target.data); var mywidth:uint = parseInt(myxml.mywidth.text(),10); var myheight:uint = parseInt(myxml.myheight.text(),10); var mycolor:uint = parseInt(myxml.mycolor.text(),16); var mytext:String = myxml.mytext.text(); var sprite:Sprite = new Sprite(); sprite.graphics.beginFill(mycolor,1); sprite.graphics.drawRect(0,0,mywidth,myheight); sprite.graphics.endFill(); addChild(sprite); sprite.x = 50; sprite.y = 50; var txtField:TextField = new TextField(); txtField.width = mywidth; txtField.height = myheight; txtField.multiline = true; txtField.wordWrap = true; txtField.htmlText = mytext; sprite.addChild(txtField); } function securityError(event:SecurityErrorEvent):void { trace("SecurityErrorEvent"); } function ioError(event:IOErrorEvent):void { trace("IOErrorEvent"); }

Результат:

И ещё один момент. Допустим, ваш XML-файл с данными часто обновляется. Тогда, чтобы флеш-приложение гарантированно загружало новую версию xml-данных, а не использовало старую версию, можно поступить следующим образом...

Код ActionScript 3.0:

import flash.net.*; import flash.events.*; import flash.display.Sprite; import flash.text.TextField; var loader:URLLoader = new URLLoader(); loader.load(new URLRequest("myxml.xml?rand="+Math.round(Math.random()*uint.MAX_VALUE))); loader.addEventListener(Event.COMPLETE,onComplete); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); loader.addEventListener(IOErrorEvent.IO_ERROR,ioError); function onComplete(event:Event):void { var myxml:XML = XML(event.target.data); var mywidth:uint = parseInt(myxml.mywidth.text(),10); var myheight:uint = parseInt(myxml.myheight.text(),10); var mycolor:uint = parseInt(myxml.mycolor.text(),16); var mytext:String = myxml.mytext.text(); var sprite:Sprite = new Sprite(); sprite.graphics.beginFill(mycolor,1); sprite.graphics.drawRect(0,0,mywidth,myheight); sprite.graphics.endFill(); addChild(sprite); sprite.x = 50; sprite.y = 50; var txtField:TextField = new TextField(); txtField.width = mywidth; txtField.height = myheight; txtField.multiline = true; txtField.wordWrap = true; txtField.htmlText = mytext; sprite.addChild(txtField); } function securityError(event:SecurityErrorEvent):void { trace("SecurityErrorEvent"); } function ioError(event:IOErrorEvent):void { trace("IOErrorEvent"); }

Последний приём не будет работать на вашем локальном компьютере (вернёт ошибку), но замечательно работает на реальном сайте.

А под конец я предлагаю вам скачать исходники к данному уроку - скачать исходник (под Adobe Flash CS 5.5). И ещё одна полезная ссылка для вас - скачать бесплатный текстовый редактор Notepad++.

Автор: admin

Дата добавления: 2012-06-08

Просмотров: 23057

Рейтинг поста: +44-

Правила перепечатки

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2015-11-04
Ответил на почту.
Комментатор
Комментарий добавил(а): bvz
Дата добавления: 2015-11-04
отправил, сижу жду.:-)
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2015-11-04
Исходник пришлите на edapskov собака yandex точка ru.
Комментатор
Комментарий добавил(а): bvz
Дата добавления: 2015-11-04
я создал. Видимо что-то не правильно. Может подскажете?
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2015-11-04
Создайте переменную img за пределами функции, как показано в примере ранее.
Комментатор
Комментарий добавил(а): Bvz
Дата добавления: 2015-11-04
А как же работать с данными из файла?

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE,onComplete);

function onComplete(event:Event) {
var img:Array = [event.target.data];

//trace(img)
//return img;
}

мне надо получить массив img вне функции... Что делать?
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2015-11-04
Никак - это локальная переменная, которая доступна только внутри функции. В вашем случае надо примерно так:


var mytext:String;

function onComplete(event:Event):void
{
mytext = myxml.mytext.text();
}
Комментатор
Комментарий добавил(а): bvz
Дата добавления: 2015-11-04
function onComplete(event:Event):void
{
var mytext:String = myxml.mytext.text();
}

как переменные отсюда получить вне функции?
например эту

trace(mytext);
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2014-08-04
Олег, в AIR вообще очень много фишек, которых нет у флеш-плеера. Вот только широкого распространения эта технология не получила. Кстати, погуглите: в сети есть официальное и очень подробное руководство по AIR на русском языке. Возможно, там есть ответ на ваш вопрос. У меня терпения не хватило, чтобы дочитать его до конца :-)
Комментатор
Комментарий добавил(а): Олег
Дата добавления: 2014-08-04
http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/net/URLRequest.html

в описании свойства URL пишут, что можно использовать
http и https
file
app-storage
app
но надо использовать AIR среду...

Но у меня почему то не получилось тоже...
Добавить комментарий:







[ + ] помощь по форматирование текста

Идиот-тест

Если все обязательные поля (отмечены * ) заполнены необходимой информацией, то нажимаем кнопку Добавить комментарий.

Страница 1 из 2: 12
Меню
Подписка
Рубрики
Метки
Последние комментарии
Рейтинг постов
Реклама
Друзья
География гостей
Статистика
Яндекс.Метрика