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++.