MXMLTest09 External XML Read Test (外部XMLデータをテキストでDataGrid表示)
forked from MXMLTest08 External XML Read Test (前回MXMLTest07からのレイアウト変更です) (diff: 431)
ActionScript3 source code
/**
* Copyright siouxcitizen ( http://wonderfl.net/user/siouxcitizen )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/1POn
*/
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="500" height="500" backgroundColor="#333333">
<mx:Script>
<![CDATA[
//Yahooショッピングから"出石そば"で検索した結果(XML)を処理
//DataGridを使ってXMLデータが表示されるようにしました。
//技術力の無さからDataGrid内での子ノードのテキスト表示のみとなりました。
//ループを使い前回MXMLTest08からソースがかなり短くできたのが唯一の成果。
//本当はListを使いたかったけれど、データうまく取り出せず挫折。
//DataGridでもlabelFunction使ったりで手間がかかりました。
//だんだん外部XMLの使用は非推奨なのかと感じてくる。。。
//↓DataGridのlabelFunctionについて参考にしたサイトです
//http://www.fxug.net/modules/xhnewbb/viewtopic.php?topic_id=1356
private var query:String = "出石そば";//検索キーワード デフォルト値設定
private var URL:String; //クエリ先URL
private var loader:URLLoader;
private var xmlData:XML;
private var ns:Namespace = new Namespace("urn:yahoo:jp:itemSearch");
//クエリ先URLと検索キーワードを結合後、クエリ先URLへ検索を行う
private function testXMLDataDisplay():void {
//外部XML処理中はボタンを不活性化
btnTest.enabled = false;
//URL+クエリ情報設定
URL = "http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch?appid=uQ_E1kmxg64.0fo1fkMwTnvcEmBn.foaHDXp0MF8WvUXD3jQcDaDIAuC0b6zRFmh3BT2umN6&query=" + escapeMultiByte(query);
var request:URLRequest = new URLRequest(URL);
request.url = URL;
loader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE, completeHandler);
try {
loader.load(request);
} catch (error:Error) {
trace("Unable to load requested document.");
}
}
import mx.controls.Alert;
//クエリ先より取得したXMLを処理
private function completeHandler(event:Event):void {
xmlData = new XML(loader.data);
var count:uint = 0;
default xml namespace = ns; //名前空間設定
//XMLデータをデータグリッドに設定
list.dataProvider = xmlData.Result.Hit;
//外部XML処理後にボタンを活性化
btnTest.enabled = true;
}
//変更されたコンボボックスの値をセット
private function onChangeCombo():void {
query = String(comboTest.selectedItem);
}
//外部XMLデータを取り出し時、「名前空間+ノード名」を設定して取り出す
private function genericLabelFunction(item:Object, dcg:DataGridColumn):String{
var currentItem:XML = XML(item);
var ns:Namespace = currentItem.namespace();
var displayValue:String = currentItem.ns::[dcg.dataField];
return displayValue;
}
]]>
</mx:Script>
<mx:Button id="btnTest" click="testXMLDataDisplay();" x="10" y="10" label="検索" enabled="true"/>
<mx:ComboBox id="comboTest" x="70" y="10" change="onChangeCombo()">
<mx:ArrayCollection>
<mx:String>出石そば</mx:String>
<mx:String>但馬牛</mx:String>
<mx:String>ズワイガニ</mx:String>
</mx:ArrayCollection>
</mx:ComboBox>
<mx:HBox x="10" y="30" width="450" height="400" verticalAlign="middle">
<mx:DataGrid id="list" width="600" height="350" rowHeight="20">
<mx:columns>
<mx:DataGridColumn dataField="Name" labelFunction="genericLabelFunction"/>
<mx:DataGridColumn dataField="Headline" labelFunction="genericLabelFunction"/>
<mx:DataGridColumn dataField="Description" labelFunction="genericLabelFunction"/>
<mx:DataGridColumn dataField="Url" labelFunction="genericLabelFunction"/>
</mx:columns>
</mx:DataGrid>
</mx:HBox>
</mx:Application>