MXMLTest09 External XML Read Test (外部XMLデータをテキストでDataGrid表示)

by siouxcitizen forked from MXMLTest08 External XML Read Test (前回MXMLTest07からのレイアウト変更です) (diff: 431)
♥1 | Line 61 | Modified 2009-04-25 06:46:25 | MIT License
play

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>

Forked