簡體   English   中英

在flex3中處理XML

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM