名前空間のある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