« 2009年6月 | メイン | 2009年8月 »

XMLを解析してタグで管理

ずーっとできなくてもやもやしてたけど解決したのでメモ!

・解析するXML

<photos>
  <photo>
    <tags>landscape,cat</tags>
    <src>photo/ph.1.jpg</src>
    <thumbnail>photo/ph.s1.jpg</thumbnail>
  </photo>

  <photo>
    <tags>landscape</tags>
    <src>photo/ph.2.jpg</src>
    <thumbnail>photo/ph.s2.jpg</thumbnail>
  </photo>

  <photo>
    <tags>landscape</tags>
    <src>photo/ph.3.jpg</src>
    <thumbnail>photo/ph.s3.jpg</thumbnail>
  </photo>

  <photo>
    <tags>cat</tags>
    <src>photo/ph.4.jpg</src>
    <thumbnail>photo/ph.s4.jpg</thumbnail>
  </photo>
</photos>


・AS
var myLoader:URLLoader = new URLLoader();
var tagObj:Object = new Object();//ここにタグの情報が入ります。
var urlObj:Object = new Object();//ここにurlの情報が入ります。

//myLoaderの読み込み完了のイベントにリスナー登録する
myLoader.addEventListener(Event.COMPLETE, completeXml);
//XML読み込み
myLoader.load(new URLRequest("photolist.xml"));

//XMLの読み込み完了後実行
function completeXml(e:Event):void {
myLoader.removeEventListener(Event.COMPLETE, completeXml);
//XMLをパースする
var _xml:XML = new XML(e.target.data);
trace(_xml);
//一時格納用配列
var tmpArray:Array;
//photoタグの数だけループさせます。
for (var i:int = 0; i < _xml.photo.length(); i++) {
//tagsタグの中身を","でsplitして、tmpArray配列として格納します。
tmpArray = _xml.photo[i].tags.split(",");
//tmpArrayに入ったタグの数だけループさせます。
for each(var str:String in tmpArray) {
//tagObjタグの名前のプロパティをArray型で生成し、データをpushしていきます。
if (!tagObj[str]) { tagObj[str] = new Array(); urlObj[str] = new Array(); tagObj[str].push(_xml.photo[i].tags); urlObj[str].push(_xml.photo[i].src); } else { tagObj[str].push(_xml.photo[i].tags); urlObj[str].push(_xml.photo[i].src); }
}
}

dbg("landscape");
// 出力
//[landscape]タグのデータは3個あります。
//photo/ph.1.jpg,photo/ph.2.jpg,photo/ph.3.jpg
//}


function dbg(str:String):void{
trace("["+str+"]タグのデータは"+tagObj[str].length+"個あります。");
trace(tagObj[str]);
trace(urlObj[str]);
}


この本を参考にさせていただきました。


2009年7月 8日 23:58