2009-06-11 5 views
0

初めての方はこちらから質問していますが、フォーマットをもっと良くする方法を学ぶのは初めてです。 私はflexを学び始めて、本を手に入れてその中の例に従おうとしました。しかし、私は問題を抱えていました。私は基本的に製品のリストを持っているXMLを返すJSPページを持っています。私はこのXMLを解析しようとしています。言い換えれば、製品を通過し、各製品ノードのオブジェクトを作成し、それらをArrayCollectionに格納しようとしています。私が持っていると信じている問題は、xmlをナビゲートする正しい方法を使用していないということです。XMLをフレックスで処理する

サーバから返されるXMLは次のようになります。

<?xml version="1.0" encoding="ISO-8859-1"?><result type="success"> 
<products> 
    <product> 
     <id>6</id> 
     <cat>electronics</cat> 
     <name>Plasma Television</name> 
     <desc>65 inch screen with 1080p</desc> 
     <price>$3000.0</price> 
    </product> 
    <product> 
     <id>7</id> 
     <cat>electronics</cat> 
     <name>Surround Sound Stereo</name> 
     <desc>7.1 surround sound receiver with wireless speakers</desc> 
     <price>$1000.0</price> 
    </product> 
    <product> 
     <id>8</id> 
     <cat>appliances</cat> 
     <name>Refrigerator</name> 
     <desc>Bottom drawer freezer with water and ice on the door</desc> 
     <price>$1200.0</price> 
    </product> 
    <product> 
     <id>9</id> 
     <cat>appliances</cat> 
     <name>Dishwasher</name> 
     <desc>Large capacity with water saver setting</desc> 
     <price>$500.0</price> 
    </product> 
    <product> 
     <id>10</id> 
     <cat>furniture</cat> 
     <name>Leather Sectional</name> 
     <desc>Plush leather with room for 6 people</desc> 
     <price>$1500.0</price> 
    </product> 
</products></result> 

そして、私は次のような製品を反復処理しようとするフレックスコード持っている:私はできる、トレースと

private function productListHandler(e:JavaFlexStoreEvent):void 
     { 
      productData = new ArrayCollection(); 
      trace(JavaServiceHandler(e.currentTarget).response); 
      for each (var item:XML in JavaServiceHandler(e.currentTarget).response..product) 
      { 
       productData.addItem({ 
        id:item.id, 
        item:item.name, 
        price:item.price, 
        description:item.desc 
       }); 
      } 
     } 

をサーバーから返されたxmlを参照してください。しかし、xmlが空であるかのようにループ内に入ることはできません。言い換えれば、JavaServiceHandler(e.currentTarget).response..productは何も返さなければなりません。誰かが助けてくれる/私が間違っている可能性があることを指摘できますか?

私JavaServiceHandlerクラスは次のようになります。

package com.wiley.jfib.store.data 
{ 
    import com.wiley.jfib.store.events.JavaFlexStoreEvent; 

    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.net.URLLoader; 
    import flash.net.URLRequest; 

    public class JavaServiceHandler extends EventDispatcher 
    { 
     public var serviceURL:String = ""; 
     public var response:XML; 

     public function JavaServiceHandler() 
     { 
     } 

     public function callServer():void 
     { 
      if(serviceURL == "") 
      { 
       throw new Error("serviceURL is a required parameter"); 
       return; 
      } 

      var loader:URLLoader = new URLLoader(); 
      loader.addEventListener(Event.COMPLETE, handleResponse); 
      loader.load(new URLRequest(serviceURL)); 

//   var httpService:HTTPService = new HTTPService(); 
//   httpService.url = serviceURL; 
//   httpService.resultFormat = "e4x"; 
//   httpService.addEventListener(Event.COMPLETE, handleResponse); 
//   httpService.send(); 

     } 

     private function handleResponse(e:Event):void 
     { 
      var loader:URLLoader = URLLoader(e.currentTarget); 
      response = XML(loader.data); 
      dispatchEvent(new JavaFlexStoreEvent(JavaFlexStoreEvent.DATA_LOADED)); 

//   var httpService:HTTPService = HTTPService(e.currentTarget); 
//   response = httpService.lastResult.product; 
//   dispatchEvent(new JavaFlexStoreEvent(JavaFlexStoreEvent.DATA_LOADED)); 

     } 

    } 
} 

私は私としてこれを参照し、それが現実ではないですが。これは、動作しないコードサンプルとして、Flexの本から来て、図に行く。

何か助けていただければ幸いです。

ジョン

答えて

0

おかげで、私は正確に、XML/Flexの達人ではないんだけど、これはタイプミスでしょうか?

for each (var item:XML in JavaServiceHandler(e.currentTarget).response..product) 

は、あなたが、私はそれを行う方法です

for each (var item:XML in JavaServiceHandler(e.currentTarget).response.result.products.product) 

を試してみました。明示的、明示的、明示的。

+0

Aethexにお返事ありがとうございます。私もそれを試みましたが、同じ結果になるでしょう。 –

0

JavaServiceHandler(e.currentTarget).responseをデバッガで見てみてください。それがあなたが参照しているXMLなら、あなたの製品へのアクセス方法はうまくいくはずです。したがって、あなたのJavaバックエンドは期待しているXMLを返さない可能性があります。

は、単純なテキストファイルから同じXMLをロードしてみるか、単にそれがさらに簡単にするために、文字列にそれを埋め込む:

[Embed (source="xmltest.xml")] 
private var xmlTest:String; 

をそしてvar xml:XML = new XML(xmlTest);でXMLを初期化してみてくださいtrace(xml..product)

+0

コメントありがとうございます。私はそれが単純なXMLファイルを読むことができるかどうかを見てこれを行うことを試みます。1つの質問、私が '埋め込み'構文コンパイラを使用してそれを好きではない?それはなぜでしょうか? –

+0

xmltest.xmlが見つからない可能性があります。このファイルをコードのルートフォルダ(通常はプロジェクトのsrcフォルダ)に配置します – Hrundik

0

XMLのルート要素はresultです。あなたがきちんとしなかったため

for each (var item:XML in JavaServiceHandler(e.currentTarget).response.products.children()) 

:なしありタイプミス、または(あなたは確かに知っていればあなただけの製品要素があるでしょう) - だから、

for each (var item:XML in JavaServiceHandler(e.currentTarget).response.products..product) 

はい、2つのドットのいずれかが必要ですあなたのXMLの上に、私はあまりにも気づくまでに時間がかかったので、あなたはルートのための製品要素を間違えた。ストーリーの道徳は、あなたのXMLを常にきちんと整理することです。

+0

私はこれを試しましたが、同じ問題です。答えをありがとう。うまくいけば、私はこの問題を見つけ出すとき、私はここに返信します –

1

私は次のコードを試してみました:あなたのハンドラクラスをエミュレート

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    creationComplete="onComplete();"> 

    <mx:Script> 
     <![CDATA[ 
      import radekg.JavaServiceHandler; 

      private function onComplete():void { 
       var jsh:JavaServiceHandler = new JavaServiceHandler(); 
       for each (var node:XML in jsh.response.products.product) { 
        trace(node.id.text()); 
        trace(node.cat.text()); 
        trace(node.name.text()); 
        trace(node.desc.text()); 
        trace(node.price.text()); 
        trace("---------------------------------------"); 
       } 
      } 

     ]]> 
    </mx:Script> 

</mx:WindowedApplication> 

そしてradekg/JavaServiceHandler.as:

package radekg 
{ 
    public class JavaServiceHandler 
    { 
     public var response:XML = <result type="success"> 
        <products> 
         <product> 
          <id>6</id> 
          <cat>electronics</cat> 
          <name>Plasma Television</name> 
          <desc>65 inch screen with 1080p</desc> 
          <price>$3000.0</price> 
         </product> 
         <product> 
          <id>7</id> 
          <cat>electronics</cat> 
          <name>Surround Sound Stereo</name> 
          <desc>7.1 surround sound receiver with wireless speakers</desc> 
          <price>$1000.0</price> 
         </product> 
         <product> 
          <id>8</id> 
          <cat>appliances</cat> 
          <name>Refrigerator</name> 
          <desc>Bottom drawer freezer with water and ice on the door</desc> 
          <price>$1200.0</price> 
         </product> 
         <product> 
          <id>9</id> 
          <cat>appliances</cat> 
          <name>Dishwasher</name> 
          <desc>Large capacity with water saver setting</desc> 
          <price>$500.0</price> 
         </product> 
         <product> 
          <id>10</id> 
          <cat>furniture</cat> 
          <name>Leather Sectional</name> 
          <desc>Plush leather with room for 6 people</desc> 
          <price>$1500.0</price> 
         </product> 
        </products></result>; 
    } 
} 

そして結果として、私は取得しています:

6 
electronics 
Plasma Television 
65 inch screen with 1080p 
$3000.0 
--------------------------------------- 
7 
electronics 
Surround Sound Stereo 
7.1 surround sound receiver with wireless speakers 
$1000.0 
--------------------------------------- 
8 
appliances 
Refrigerator 
Bottom drawer freezer with water and ice on the door 
$1200.0 
--------------------------------------- 
9 
appliances 
Dishwasher 
Large capacity with water saver setting 
$500.0 
--------------------------------------- 
10 
furniture 
Leather Sectional 
Plush leather with room for 6 people 
$1500.0 
--------------------------------------- 

JavaServiceHandler.resultはXMLルートタグを指しています。つまり、あなたの代わりに:

for each (var item:XML in JavaServiceHandler(e.currentTarget).response.products..product) 

と:

for each (var item:XML in JavaServiceHandler(e.currentTarget).response.products.product) 

お役に立てば幸いです。 JavaFlexStoreEvent.asでDATA_LOADEDため

0

割り当てる静的な値が

のpublic static constのDATA_LOADED:文字列=

0

は、私はあなたがここにJAvaFlexStoreEVentを作成していない私は完全なクラス

パッケージを投稿しています考える "onDataLoaded" COM .wiley.jfib.store.events { import flash.events.Event;私はあなたがHTTPサービスの利用をコメントアウトしていることがわかり

public class javaFlexStoreEvent extends Event 
{ 
    public static const DATA_LOADED:String="onDataLoaded"; 
    public function javaFlexStoreEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
     super(type, bubbles, cancelable); 
    } 

} 

}

0

。このオブジェクトを使用し、結果データ型を 'OBJECT'と指定すると、静的変数 'HTTPService.RESULT_FORMAT_OBJECT'を介してアクセスできます。これにより、XMLが自動的にオブジェクトとして解析されます。 XMLをループするのではなく、単純なドット表記を使用してデータにアクセスすることができます。

この変更を加えたら、デバッガを使用してアプリケーションを実行します。コードを結果ハンドラのコードにブレークインし、結果データを確認します。 XMLがObjectPoxyオブジェクトのArrayCollectionに解析されていることがわかるはずです。このオブジェクトはループし、アプリケーションで使用するために独自のオブジェクトにマップできます。

ここでの利点は、内部パーサがネームスペースやそれ以外のほとんどのバリエーションのXMLを処理することであり、気にする必要はありません。

大量のデータセットではパフォーマンスが低下する可能性がありますが、もちろん、独自の解析コードを作成する効率にかかっています。