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

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

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

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

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2014-08-04
> AS3.0 не может поднять SSL-канал?

Возможно, вы и правы. Не припомню работающих примеров с https на AS 3.0. Значит надо будет скриптом копировать данные на свой сервер, а потом со своего сервера загружать в флеш-приложение.
Комментатор
Комментарий добавил(а): Олег
Дата добавления: 2014-08-04
Как быть, если надо загрузить файл с https - ресурса?
Если указать такой путь, то выдает ошибку "ошибка потока".
AS3.0 не может поднять SSL-канал?
Комментатор
Комментарий добавил(а): Сергей
Дата добавления: 2013-10-22
спасибо за помощь
Комментатор
Комментарий добавил(а): agriel
Дата добавления: 2013-07-11
Потрясающий урок! А вы можете еще развить тему и несколько уроков про XML представить?
Комментатор
Комментарий добавил(а): Сергей
Дата добавления: 2013-03-23
Как вариант... Спасибо за помощь и за уроки.
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2013-03-23
Сергей, а может немного модернизировать сам XML и тогда ваша задача будет решаться гораздо проще:

var myXml:XML = <doc><mytext><txt>мой текст, лалала</txt><twod>ситуация номер 1</twod><txt>тра-та-та</txt><oned>ситуация номер 2</oned><txt>и снова мой текст</txt></mytext></doc>;
trace(myXml.mytext.*.(name()!="twod").text());
trace(myXml.mytext.*.(name()!="oned").text());
Комментатор
Комментарий добавил(а): Сергей
Дата добавления: 2013-03-23
Есть вопрос: а как можно вывести текст, который имеет несколько вариантов развития в зависимости от значения каких-нибудь переменных? К примеру, текст в XML-файле:
<?xml version="1.0" encoding="utf-8"?>
<doc>
<mytext>мой текст, лалала <twod>ситуация номер 1</twod> тра-та-та <oned>ситуация номер 2</oned> и снова мой текст</mytext>
</doc>

И задача стоит в том, чтобы в определенном случае выводить mytext со вставками twod, а в другом - со вставками oned. Так как я только смог выводить их поочередно или не выводить вовсе((
Добавить комментарий:







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

Идиот-тест

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

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