AS3でXML

最近全然ブログを更新していないので小ネタをポチポチ放出します。
とりあえず超基礎の基礎ですがAS3でXMLをロードする時のソースと小ネタです。

とりあえずソース

xmlTest.as

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.URLRequestHeader;

	public class xmlTest extends Sprite
	{
		private var m_loader:URLLoader;
		private var m_data:XML;
		
		public function xmlTest()
		{
			var url:String="http://localhost/text.xml";
			
			m_loader = new URLLoader();
			m_loader.addEventListener(ProgressEvent.PROGRESS,progressHandler);
			m_loader.addEventListener(Event.COMPLETE,completeHandler);
			m_loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
			m_loader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);

			var header:URLRequestHeader = new URLRequestHeader("pragma", "no-cache");
			var ureq:URLRequest = new URLRequest(url);
			ureq.requestHeaders.push(header);

			m_loader.load(ureq);
		}
	        private function completeHandler(evt:Event):void{
			trace("Loader : => Load complete");
			try{
				m_data = new XML(m_loader.data);
			}catch	(err:TypeError) {  
				trace("XML exception"+err.message);
			}
			trace(m_data);
		}
        	private function progressHandler(evt:ProgressEvent):void{
			trace("Loader : => Loading > "+m_loader.bytesLoaded);
		}		
		private function ioErrorHandler(evt:IOErrorEvent):void{
			trace("Loader : => !!! IOerror !!!");
		}
		private function securityErrorHandler(evt:SecurityErrorEvent):void{
			trace("Loader : => !!! Security error !!!");
		}
	}
}

小ネタ

ブラウザキャッシュ

urlローダーはブラウザを使ってHTTPリクエストを投げます。XMLでステータスをロードするような場合、同じアドレスに連続してgetリクエストを投げるため、ブラウザにキャッシュされてしまい、ステータスの変化を入手できません。

	var header:URLRequestHeader = new URLRequestHeader("pragma", "no-cache");
	var ureq:URLRequest = new URLRequest(url);
	ureq.requestHeaders.push(header);

そこで、上記のソースのようにリクエストのヘッダにブラウザキャッシュをしないように指定します。
これにより、同アドレスに連続したリクエストを投げてステータス変化を取得出来るようになります。
逆に普通にHTTPコンテンツを入手したい場合はサーバーに負荷がかかるので、入れない方がいいかもしれませんね。

例外処理

XMLをローダーから読み込んだ際、XMLが少しでも正常ではない場合以下のようなエラーが出てスクリプトが停止します。

  • TypeError: Error #1085: エレメント型 "aaa" は対応する終了タグ "" で終了する必要があります。
  • TypeError: Error #1090: XML パーサエラー :エレメントの形式が正しくありません。
  • TypeError: Error #1095: XML パーサエラー :属性が終了していません。
  • TypeError: Error #1104: 属性 "type" (エレメント "bbb") は既に指定されています。

等々
XMLを手作業で作っているときはもちろん、プログラムから生成したXMLであってもhttpでの受信時にデータが壊れる可能性があります。
なので例外処理をXMLパーサに渡す際に入れておきます。

	try{
		m_data = new XML(m_loader.data);
	}catch	(err:TypeError) {  
		trace("XML exception"+err.message);
	}

これで、XMLが壊れている場合はコンソールに例外のメッセージが出力されてプログラムは継続されます。
XMLを扱う説明をするサイトでは例外処理を入れたサンプルを提示して所が意外と少ないので小ネタとして紹介しました。