проблемы с фильтрацией XMLListCollection

Я пытаюсь создать своего рода ранжирование. Для этого я использую многоуровневый xml, который я создаю с помощью файла php.

<klassement>    
      <reeks>
         <reeksId>1</reeksId>
         <reeksNaam>3de klasse</reeksNaam>
         <ploeg>
            <ploegNaam>Foo</ploegNaam>
            <goalsMade>60</goalsMade>
            <points>12</points>
         </ploeg>
         <ploeg>
            <ploegNaam>bar</ploegNaam>
            <goalsMade>10</goalsMade>
            <points>2</points>
         </ploeg>    
      </reeks>    
      <reeks>
         <reeksId>2</reeksId>
         <reeksNaam>3de klasse res</reeksNaam>
         <ploeg>
            <ploegNaam>Foo res</ploegNaam>
            <goalsMade>50</goalsMade>
            <points>12</points>
         </ploeg>
         <ploeg>
            <ploegNaam>bar</ploegNaam>
            <goalsMade>40</goalsMade>
            <points>8</points>
         </ploeg>    
       </reeks> 
</klassement>

И так далее, и так далее (вы поняли) я получаю информацию с помощью httpService в своем приложении. После этого я помещаю эту информацию в XMLListCollection. Теперь я пытаюсь разделить уровни (возможно, не так, но это работает). Когда я отлаживаю, я вижу, что в этих двух новых переменных есть правильные вещи, но когда я говорю, что dataProvider сетки данных должен быть klassementKern, я получаю сообщение об ошибке «неявное приведение значения типа XML к несвязанный тип mx.collections:IList"

Кто-нибудь знает, почему это так и как я могу это исправить?

<?xml version="1.0" encoding="utf-8"?>
<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009" 
                    xmlns:s="library://ns.adobe.com/flex/spark" 
                    xmlns:mx="library://ns.adobe.com/flex/mx"
                    height="600"
                    skinClass="skins.ListContainerSkin"
                    creationComplete="httpKlassement.send()">
    <fx:Declarations>
        <s:HTTPService id="httpKlassement"
                       url="http://localhost/flexScripts/klassement.php"
                       resultFormat="e4x"
                       result="showKlassement(event)"/>
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.collections.XMLListCollection;
            import mx.rpc.events.ResultEvent;

            [Bindable]
            private var klassement:XMLListCollection;
            [Bindable]
            private var klassementKern:XML;
            [Bindable]
            private var klassementReserve:XML;


            protected function showKlassement(event:ResultEvent):void
            {
                klassement = new XMLListCollection(event.result.reeks);
                klassementKern = klassement[0]; 
                klassementReserve = klassement[1];
            }
        ]]>
    </fx:Script>
    <s:layout>
        <s:VerticalLayout gap="10" paddingLeft="10" paddingTop="10" paddingRight="10" paddingBottom="10"/>
    </s:layout>

    <s:DataGrid width="760" height="230" dataProvider="{klassementKern}">
        <s:columns>
            <s:ArrayCollection>
                <s:GridColumn headerText="Ploeg" dataField="ploeg.ploegNaam"/>
                <s:GridColumn headerText="WG" dataField="ploeg.aantalGespeeld"/>
                <s:GridColumn headerText="W" dataField="ploeg.aantalGewonnen"/>
                <s:GridColumn headerText="V" dataField="ploeg.aantalVerloren"/>
                <s:GridColumn headerText="G" dataField="ploeg.aantalGelijk"/>
                <s:GridColumn headerText="D+" dataField="ploeg.goalenGemaakt"/>
                <s:GridColumn headerText="D-" dataField="ploeg.goalenTegen"/>
                <s:GridColumn headerText="Punten" dataField="ploeg.punten"/>
                <s:GridColumn headerText="DS" dataField="ploeg.doelpuntensaldo"/>
            </s:ArrayCollection>
        </s:columns>
    </s:DataGrid>
</s:NavigatorContent>

person Nathalie De Hertogh    schedule 23.12.2011    source источник
comment
Entschuldi, mein Niederländisch ist nicht so gut...   -  person SQLiteNoob    schedule 24.12.2011
comment
Попробовал создать файл data.xml с предоставленным вами xml. Работает, ошибок нет. Пожалуйста, подтвердите, что klassement.php дает правильный xml, вы можете проверить ответ сервера в firebug.   -  person Diode    schedule 24.12.2011
comment
Когда я открываю php-скрипт в chrome, он дает мне правильную структуру xml, когда я отлаживаю в классе flash builder, klassementKern и klassementReserve заполняются правильной информацией, но я не получаю информацию в сетке данных. Я выложил его сегодня днем. Ссылка на файл php: dehertoghnathalie2011.dreamhosters.com/flexScripts/ ( доменное имя было для чего-то другого, но нам пришлось сбросить файлы php в ту же учетную запись, в новую папку). Прямо сейчас я решил это, жестко запрограммировав сетки данных и заголовок, но было бы лучше с httpsService   -  person Nathalie De Hertogh    schedule 25.12.2011


Ответы (2)


У меня работает с закодированной константой XML, так что вы, вероятно, получите что-то еще с сервера:

<?xml version="1.0" encoding="utf-8"?>
<s:Application 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    minWidth="955" minHeight="600"
    creationComplete="showKlassement(event)">

    <fx:Script>
        <![CDATA[
            import mx.collections.XMLListCollection;
            import mx.events.FlexEvent;

            private const MY_XML:XML =
                <klassement>    
                      <reeks>
                         <reeksId>1</reeksId>
                         <reeksNaam>3de klasse</reeksNaam>
                         <ploeg>
                            <ploegNaam>Foo</ploegNaam>
                            <goalsMade>60</goalsMade>
                            <points>12</points>
                         </ploeg>
                         <ploeg>
                            <ploegNaam>bar</ploegNaam>
                            <goalsMade>10</goalsMade>
                            <points>2</points>
                         </ploeg>    
                      </reeks>    
                      <reeks>
                         <reeksId>2</reeksId>
                         <reeksNaam>3de klasse res</reeksNaam>
                         <ploeg>
                            <ploegNaam>Foo res</ploegNaam>
                            <goalsMade>50</goalsMade>
                            <points>12</points>
                         </ploeg>
                         <ploeg>
                            <ploegNaam>bar</ploegNaam>
                            <goalsMade>40</goalsMade>
                            <points>8</points>
                         </ploeg>    
                       </reeks> 
                </klassement>;                  

            [Bindable]
            private var klassement:XMLListCollection;
            [Bindable]
            private var klassementKern:XML;
            [Bindable]
            private var klassementReserve:XML;

            private function showKlassement(event:FlexEvent):void   {
                klassement = new XMLListCollection(MY_XML.reeks);
                klassementKern = klassement[0]; 
                klassementReserve = klassement[1];
            }
        ]]>
    </fx:Script>
    <s:layout>
        <s:VerticalLayout gap="10" paddingLeft="10" paddingTop="10" paddingRight="10" paddingBottom="10"/>
    </s:layout>

    <s:DataGrid width="760" height="230" dataProvider="{klassement}">
        <s:columns>
            <s:ArrayCollection>
                <s:GridColumn headerText="Ploeg" dataField="ploeg.ploegNaam"/>
                <s:GridColumn headerText="WG" dataField="ploeg.aantalGespeeld"/>
                <s:GridColumn headerText="W" dataField="ploeg.aantalGewonnen"/>
                <s:GridColumn headerText="V" dataField="ploeg.aantalVerloren"/>
                <s:GridColumn headerText="G" dataField="ploeg.aantalGelijk"/>
                <s:GridColumn headerText="D+" dataField="ploeg.goalenGemaakt"/>
                <s:GridColumn headerText="D-" dataField="ploeg.goalenTegen"/>
                <s:GridColumn headerText="Punten" dataField="ploeg.punten"/>
                <s:GridColumn headerText="DS" dataField="ploeg.doelpuntensaldo"/>
            </s:ArrayCollection>
        </s:columns>
    </s:DataGrid>
</s:Application>
person Alexander Farber    schedule 24.12.2011
comment
но разве вы не получаете только одну сетку данных? Мне нужно 2, один для «Керн» и один для «Резерва». И почему он будет показывать данные, если вы их жестко запрограммируете, а не когда я использую httpService? Я нахожу это странным :) (или это потому, что я новичок в этом =D) - person Nathalie De Hertogh; 25.12.2011
comment
Может быть, потому что httpService доставляет что-то еще, например текст ошибки? - person Alexander Farber; 25.12.2011
comment
Никакой httpService не дает мне правильную информацию. Ссылка на файл php (который создает xml написана в комментарии выше). Когда я отлаживаю его, я вижу правильную информацию во всех переменных. - person Nathalie De Hertogh; 26.12.2011

Я нашел решение. Я опубликую свой новый код ниже на случай, если у кого-то возникнет такая же проблема.

<?xml version="1.0" encoding="utf-8"?>
<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009" 
                    xmlns:s="library://ns.adobe.com/flex/spark" 
                    xmlns:mx="library://ns.adobe.com/flex/mx"
                    creationComplete="httpKlassement.send()" 
                    xmlns:components="components.*">

    <fx:Declarations>
        <s:HTTPService id="httpKlassement"
                       url="http://www.dehertoghnathalie2011.dreamhosters.com/flexScripts/klassement.php"
                       result="showKlassement(event)"
                       fault="httpKlassement_faultHandler(event)"/>
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.collections.IList;
            import mx.collections.XMLListCollection;
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;

            [Bindable]
            private var klassement:ArrayCollection;
            [Bindable]
            private var klassementKern:Object;
            [Bindable]
            private var kern:IList;
            [Bindable]
            private var klassementReserve:Object;
            [Bindable]
            private var reserve:IList;


            protected function showKlassement(event:ResultEvent):void
            {
                klassement = event.result.klassement.reeks;
                klassementKern = klassement[0]; 
                kern = klassementKern.ploeg;
                klassementReserve = klassement[1];  
                reserve = klassementReserve.ploeg;
            }

            protected function httpKlassement_faultHandler(event:FaultEvent):void
            {
                Alert.show(event.fault.faultString, "Foutmelding");
            }

        ]]>
    </fx:Script>
    <s:layout>
        <s:VerticalLayout gap="10" paddingLeft="10" paddingTop="0" paddingRight="10" paddingBottom="10"/>
    </s:layout>

    <s:DataGrid width="760" height="235" dataProvider="{kern}">
        <s:columns>
            <s:ArrayCollection>         
                <s:GridColumn headerText="Ploeg" dataField="ploegNaam"/>
                <s:GridColumn headerText="WG" dataField="aantalGespeeld"/>
                <s:GridColumn headerText="W" dataField="aantalGewonnen"/>
                <s:GridColumn headerText="V" dataField="aantalVerloren"/>
                <s:GridColumn headerText="G" dataField="aantalGelijk"/>
                <s:GridColumn headerText="D+" dataField="goalenGemaakt"/>
                <s:GridColumn headerText="D-" dataField="goalenTegen"/>
                <s:GridColumn headerText="Punten" dataField="punten"/>
                <s:GridColumn headerText="DS" dataField="doelpuntensaldo"/>
            </s:ArrayCollection>
        </s:columns>
    </s:DataGrid>

    <s:DataGrid width="760" height="235" dataProvider="{reserve}">
        <s:columns>
            <s:ArrayCollection>         
                <s:GridColumn headerText="Ploeg" dataField="ploegNaam"/>
                <s:GridColumn headerText="WG" dataField="aantalGespeeld"/>
                <s:GridColumn headerText="W" dataField="aantalGewonnen"/>
                <s:GridColumn headerText="V" dataField="aantalVerloren"/>
                <s:GridColumn headerText="G" dataField="aantalGelijk"/>
                <s:GridColumn headerText="D+" dataField="goalenGemaakt"/>
                <s:GridColumn headerText="D-" dataField="goalenTegen"/>
                <s:GridColumn headerText="Punten" dataField="punten"/>
                <s:GridColumn headerText="DS" dataField="doelpuntensaldo"/>
            </s:ArrayCollection>
        </s:columns>
    </s:DataGrid>
</s:NavigatorContent>
person Nathalie De Hertogh    schedule 25.12.2011