[英]Processing XML in flex3
第一次在這里問一個問題,仍然在學習如何更好地設置格式...對這種格式感到抱歉,因為它看起來不太好。 我已經開始學習flex並撿起一本書,並嘗試遵循其中的示例。 但是,我遇到了一個問題。 我有一個jsp頁面,該頁面返回的xml基本上具有產品列表。 我正在嘗試解析此xml,換句話說,遍歷產品,並為每個產品節點創建對象並將其存儲在ArrayCollection中。 我認為我遇到的問題是我沒有使用正確的方式瀏覽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>
我有flex代碼,嘗試對以下產品進行迭代:
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書中獲得的代碼示例,該代碼示例無法正常工作,請參見圖。
任何幫助表示贊賞。
謝謝
約翰
我只是嘗試下面的代碼:
<?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分配靜態值
公共靜態常量DATA_LOADED:String =“ onDataLoaded”
我認為您尚未創建JAvaFlexStoreEVent我在這里發布了完整的課程
包com.wiley.jfib.store.events {import flash.events.Event;
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);
}
}
}
我看到您已注釋掉http服務的使用。 如果使用此對象,然后指定結果數據類型“ OBJECT”,則可以通過靜態變量“ HTTPService.RESULT_FORMAT_OBJECT”進行訪問。 然后,它將自動將XML解析為對象。 然后,您可以使用簡單的點符號來訪問數據,而不是遍歷XML。
進行更改后,請使用調試器運行應用程序。 在結果處理程序代碼處斷點代碼,然后查看結果數據。 您應該看到XML已解析為ObjectPoxy對象的ArrayCollection,然后可以循環並映射到您自己的對象以在應用程序中使用。
這樣做的好處是內部解析器將處理名稱空間以及您向其拋出的XML的大多數其他變體,而不必擔心它。
使用大型數據集可能會損失一些性能,但是當然這僅取決於編寫自己的解析代碼的效率。
我不是完全是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 )
這就是我的方法。 顯式,顯式,顯式。
嘗試使用調試器查看JavaServiceHandler(e.currentTarget).response
。 如果它是您所指的XML,則訪問產品的方法應該可以使用。 因此,您的Java后端很可能返回的不是您期望的XML。
嘗試從一個簡單的文本文件中加載相同的XML,或者只是將其嵌入到字符串中以使其更加簡單:
[Embed (source="xmltest.xml")]
private var xmlTest:String;
然后使用var xml:XML = new XML(xmlTest);
初始化XML var xml:XML = new XML(xmlTest);
並嘗試trace(xml..product)
XML中的根元素是結果。 所以你應該有
for each (var item:XML in JavaServiceHandler(e.currentTarget).response.products..product )
是的,兩個點-那里沒有錯字,或者(如果您確定知道只有產品元素):
for each (var item:XML in JavaServiceHandler(e.currentTarget).response.products.children() )
因為您沒有整理XML,所以您將product元素誤認為是根元素,因為我也花了一些時間才注意到。 這個故事的寓意是:總是整理XML。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.