XMLの読込
AS3.0でのXMLの読込をやってみます。AS2.0ではfirstChild.firstChild.childNodes
みたいに記述してもう厭んなりCASA Frameworkを使ったりしていましたが大分解り易くなりました。
参考にさせて頂いたページ
まず外部XMLを読込むXMLloaderクラスを作ります。
package {
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.system.System;
import flash.events.Event;
public class XMLloader extends EventDispatcher
{
public static const LOAD_COMPLETE:String = "load_complete";
var xmlLoader:URLLoader;
var my_xml:XML;
//コンストラクタ
function XMLloader(url:String, isUnicode:Boolean)
{
//URLLoader作成
xmlLoader = new URLLoader();
xmlLoader.dataFormat = URLLoaderDataFormat.TEXT;
xmlLoader.addEventListener(Event.COMPLETE, onXMLloaded);
//URL
var urlReq:URLRequest = new URLRequest(url);
//Unicode以外ならtrue
System.useCodePage = ! isUnicode;
//読込開始
xmlLoader.load(urlReq);
}
//読込完了
function onXMLloaded(event:Event):void
{
try {
//XMLオブジェクトに変換
my_xml = new XML(xmlLoader.data);
//カスタムイベントを配信
dispatchEvent(new Event(LOAD_COMPLETE));
} catch (err:TypeError){
trace(err.message);
}
}
//XMLオブジェクトを返す(他のクラスからのアクセスに対応)
public function getXML():XML
{
return my_xml;
}
}
}
XMLを読込み、読込んだXMLデータをXMLオブジェクトに変換します。読込みが終わって、XMLオブジェクトに変換されたら、LOAD_COMPLETEのカスタムイベントを配信します。このようにカスタムイベントを設定しておくと他のクラスに処理を引き継ぐことができます。最後にXMLオブジェクトを他のクラスから利用出来るようにpublic属性のgetXML()メソッドを定義しておきます。
続いて上記XMLloaderクラスを使ってxmlファイルを読込んでパースするNewsXMLEventクラスを作ります。ニュースの情報を持つwhatsNew.xmlファイルを読込んでその内容を出力します。
package {
import flash.events.Event;
import XMLloader;
public class NewsXMLEvent
{
public var xmlLoader:XMLloader;
public var whatsXml:XML;
//コンストラクタ
public function NewsXMLEvent(url:String, isUnicode:Boolean)
{
xmlLoader = new XMLloader(url, isUnicode);
xmlLoader.addEventListener(XMLloader.LOAD_COMPLETE, onXMLloaded);
}
//XML読込完了
private function onXMLloaded(event:Event):void
{
//XML取得
whatsXml = xmlLoader.getXML();
traceNewList();
}
private function traceNewList():void
{
for each(item in whatsXml.news)
{
var item:XML;
//textを出力
trace(item.date + "のニュースは" + item.text);
}
}
}
}
読込むwhatsNew.xml。日付と内容の情報を持っています。
<?xml version="1.0" encoding="UTF-8"?> <data> <news> <date>11/20</date> <text>ニュース1</text> </news> <news> <date>11/19</date> <text>ニュース2</text> </news> <news> <date>11/18</date> <text>ニュース3</text> </news> </data>
メインのドキュメントクラスでは引数に読込むxmlのパスを指定します。
package {
import flash.display.Sprite;
import flash.events.Event;
import NewsXMLEvent;
public class Main extends Sprite
{
//コンストラクタ
public function Main():void
{
var url:String = "whatsNew.xml";
var isUnicode:Boolean = false;
var _news:NewsXMLEvent = new NewsXMLEvent(url , isUnicode);
}
}
}
結果、こんなのが出力されます。
11/20のニュースはニュース1 11/19のニュースはニュース2 11/18のニュースはニュース3
