名前空間のあるXMLを扱う

Flex2には、XMLを扱うXMLクラスという便利なクラスがあるのですが、名前空間のあるXMLを扱おうとするとうまく取得できません。
名前空間のあるXMLを扱う場合には、Namespaceクラスを使う必要があります。


Namespaceクラスを使うには。

 var atom:Namespace = new Namespace("http://www.w3.org/2005/Atom");

とするか、

 var atom:Namespace = feed.namespace();

とします。


namespaceメソッドは、引数を指定していない場合、デフォルト名前空間を返します。
接頭辞のある名前空間を取得する場合は、namespaceメソッドに引数に接頭辞を渡してやれば取得できます。


その後、以下のようにすれば各要素にアクセスできるようになります。

for each (var entry:XML in feed.atom::entry) {
	trace(entry.atom::title + "\n");
}


以下のソースコードは、Atom文書を持ってきてタイトルを表示するサンプルです。
ちなみに、自分と同じドメインにあるものか、crossdomain.xmlがおいてあるドメインのものでないとセキュリティエラーになります。


サンプルを実行する

いや〜、しかしスーパーpre記法は便利ですね。

 package {
	import flash.display.*;
	import flash.text.*;
	import flash.events.*;
	import flash.net.*;
	//ネットからのテキストの読み込み
	public class XMLLoader extends Sprite {
		private var label:TextField;
		//コンストラクタ
		public function XMLLoader() {
			label=createTextField("読み込み開始");
			addChild(label);
			//リクエスト生成
			var request:URLRequest=new URLRequest("http://designrule.jp/atom");
			//ローダーの生成
			var loader:URLLoader=new URLLoader();			
			//リスナーの指定
			loader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
			loader.addEventListener(Event.COMPLETE, completeHandler);
			loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			loader.load(request);
		}
		
		private function createTextField(text:String):TextField{
			var label:TextField = new TextField();
			label.text = text;
			label.autoSize = TextFieldAutoSize.LEFT;
			label.selectable = false;
			return label;
		}
		//プログレスイベントの処理
		private function progressHandler(evt:ProgressEvent):void {
			label.text="ロード中 "+evt.bytesLoaded+"/"+evt.bytesTotal;
		}
		
		//完了イベントの処理
		private function completeHandler(evt:Event):void {
			var loader:URLLoader=URLLoader(evt.target);
			label.text="";
			//XMLをパース
			var feed:XML = new XML(loader.data);
			var atom:Namespace = feed.namespace();
			for each (var entry:XML in feed.atom::entry) {
				label.appendText(entry.atom::title + "\n");
			}
		}
		
		
		//IOエラーイベントの処理
		private function ioErrorHandler(evt:IOErrorEvent):void {
			label.text="IOエラー";
		}
		
		
		//セキュリティエラーイベントの処理
		private function securityErrorHandler(evt:SecurityErrorEvent):void {
			label.text="セキュリティエラー";
		}
	}

}

参考:
http://www.saturn.dti.ne.jp/~npaka/flash/as30/XMLEx/index.html
http://livedocs.adobe.com/flex/201_jp/langref/XML.html#namespace()
http://livedocs.adobe.com/flex/2_jp/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001918.html