Обработка XML в flex3 - PullRequest
0 голосов
/ 12 июня 2009

Впервые здесь задают вопрос и все еще учатся тому, как лучше форматировать вещи ... так что извините за формат, так как он выглядит не очень хорошо Я начал изучать флекс, взял книгу и попытался следовать приведенным в ней примерам. Тем не менее, я застрял с проблемой. У меня есть страница 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>

И у меня есть гибкий код, который пытается перебрать продукты, подобные следующим:

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 в качестве примера кода, который не работает, см. Рисунок.

Любая помощь приветствуется.

Спасибо

джон

Ответы [ 7 ]

1 голос
/ 18 июня 2009

Я только что попробовал следующий код:

<?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 )

Надеюсь, это поможет.

0 голосов
/ 28 февраля 2012

Я вижу, что вы прокомментировали использование службы http. Если вы используете этот объект, а затем укажите тип данных результата «OBJECT», доступ к которому можно получить через статическую переменную «HTTPService.RESULT_FORMAT_OBJECT». Затем он автоматически проанализирует ваш XML на объекты для вас. Затем вы можете использовать простые точечные обозначения для доступа к данным, а не циклически перебирать XML.

Как только вы сделаете это изменение, запустите приложение с помощью отладчика. Точка останова вашего кода на код обработчика результатов и взглянуть на данные результата. Вы должны увидеть, что ваш XML был проанализирован в ArrayCollection объектов ObjectPoxy, которые вы можете затем зациклить и отобразить на ваши собственные объекты для использования в вашем приложении.

Преимущество здесь в том, что внутренний анализатор будет обрабатывать пространства имен и большинство других вариантов XML, которые вы к нему добавляете, без необходимости беспокоиться об этом.

Вы можете потерять некоторую производительность с большими наборами данных, но, конечно, это зависит только от того, насколько эффективно вы сможете написать свой собственный код синтаксического анализа.

0 голосов
/ 28 августа 2009

Я думаю, что вы не созданы

пакет com.wiley.jfib.store.events { импорт 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);
    }

}

}

0 голосов
/ 28 августа 2009

Назначить статическое значение для DATA_LOADED в JavaFlexStoreEvent.as

public static const DATA_LOADED: String = "onDataLoaded"

0 голосов
/ 12 июня 2009

Корневым элементом в вашем 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, вы ошибочно приняли элемент products за корень, поскольку мне тоже потребовалось некоторое время, чтобы это заметить. Мораль этой истории такова: всегда приводите в порядок свой XML.

0 голосов
/ 12 июня 2009

Попробуйте посмотреть на JavaServiceHandler(e.currentTarget).response с помощью отладчика. Если это тот XML-код, на который вы ссылаетесь, тогда ваш метод доступа к продукту должен работать. Таким образом, вполне вероятно, что ваш бэкэнд Java возвращает не тот XML, который вы ожидаете.

Попробуйте загрузить тот же XML из простого текстового файла или просто внедрите его в строку, чтобы сделать его еще более простым:

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

А затем инициализируйте XML с помощью var xml:XML = new XML(xmlTest); и попробуйте trace(xml..product)

0 голосов
/ 12 июня 2009

Я не совсем умник 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 )

Вот как я это делаю. Явный, явный, явный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...