[AS3]外部XMLのデータを読み込んでObjectオブジェクトとして配列に格納する [Edit]

AS3からXMLの扱いがとっても簡単になったそうですね。
それならばいっそのこと、ファイルパスとファイル名だけ書き換えればあとは自動で読み込んで配列に格納してくれちゃうと便利だな。
それも、配列に入れるときに、Objectオブジェクトにしてあると、子ノードのデータの呼び出しも配列番号でいけるからもっと楽チンだな。と思って、書いてみました。

■XMLファイルについて
子ノードまでです。孫ノードには対応していません。
また、各ノードごとの子ノード数&子ノード名は統一してあることが前提です。
data1.xml の中身

<xml>
<xmldata>
<id>1</id>
<title>いろはにほへと</title>
<text> いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせすん 色は匂へど 散りぬるを 我が世誰そ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず </text>
<img1>hogehoge1.png</img1>
<img2>hogehoge2.png</img2>
</xmldata>
<xmldata>
<id>2</id>
<title>じゅげむ</title>
<text> じゅげむじゅげむごこうのすりきれかいじゃりすいぎょのすいぎょうまつうんらいまつふうらいまつくうねるところにすむところやぶらこうじのやぶこうじぱいぽぱいぽぱいぽのしゅーりんがんしゅーりんがんのぐーりんだいぐーりんだいのぽんぽこぴーのぽんぽこなーのちょうきゅうめいのちょうすけ</text>
<img1>hogehoge3.png</img1>
</xmldata>
</xml>

■スクリプトについて
ここでは、xmldataノードに格納されている子ノードのデータを子ノード名をObjectオブジェクトのプロパティ値として設定します。

/*----XMLからデータを読み込んでObjectオブジェクトの形で配列に格納する処理---*/
/*----値を使用するときは、「配列名[0][Objectオブジェクトのプロパティ名]」で呼び出す。----*/
/*----Objectオブジェクトを格納した配列名[index番号][子ノード名を格納した配列名[index番号]]----*/
/*----ここでは「nodeData_array[x][dataNodeList_array[i]]」のx,iに適切な番号を入れて呼び出す----*/

//+++++設定する箇所ここから+++++//
// URLを定数で設定
const myURL:String = "commons/images/";
const xmlUrl:String = myURL+"topic1.xml";
//+++++設定する箇所ここまで+++++//

//XMLを読み込む変数(my_xml)を設定
var my_xml:XML;

//XMLの指定ノードを格納する変数を設定
var dataNodeList:XMLList;//xmldataノード

// XMLのLoaderオブジェクトを作成
var myLoader:URLLoader = new URLLoader();

// XMLのURLリクエストを作成
var myRequest:URLRequest=new URLRequest(xmlUrl);

// XMLの子ノード名を格納する配列を宣言
var dataNodeList_array:Array;

// XMLの全データを格納する配列を宣言
var nodeData_array:Array ;

//XMLのロード後に処理を行うイベントリスナーを設定
myLoader.addEventListener(Event.COMPLETE, SetArray);

//XMLをロードする
myLoader.load(myRequest);

function SetArray(evt:Event):void {
//読み込んだXMLオブジェクトを変数に代入
my_xml=XML(myLoader.data);

//XMLの第一階層のdataノードを変数に代入
dataNodeList=my_xml.xmldata;

// XMLのノード名を格納する配列を作成
dataNodeList_array = new Array();

// XMLのノード名を配列に格納(子ノードの個数は同一であること/孫ノードは未対応)
//dataNodeList_array = id,title,text,img1,img2
for each (var p:XML in dataNodeList[0].*){
var xProp:String = p.localName();
dataNodeList_array.push(xProp);
}

// XMLのdataノード以下の子ノードデータを格納する配列を作成
nodeData_array = new Array();

// Objectオブジェクトを作成し、XMLのノード名をプロパティに、ノードタグの値をプロパティ値に代入。
for (var x:uint = 0 ; x < dataNodeList.length() ; x++ ){

nodeData_array[x] = new Object();

for ( var i:uint = 0 ; i < dataNodeList_array.length ; i++){

nodeData_array[x][dataNodeList_array[i]] = dataNodeList[x].elements(dataNodeList_array[i]).toString();
trace([dataNodeList_array[i]],nodeData_array[x][dataNodeList_array[i]]);
};
};
}

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事