Skip navigation
Currently Being Moderated

Converting XMLList to ArrayCollection

Nov 13, 2008 2:31 AM

Hi, I have an XML List as follows :
<items name="total">
<item name="value1" percentage="35"/>
<item name="value2" percentage="25"/>
<item name="value3" percentage="47"/>
<item name="value4" percentage="89"/>
</items>
<items name="somesub">
<item name="value1" percentage="15"/>
<item name="value2" percentage="27"/>
<item name="value3" percentage="56"/>
<item name="value4" percentage="43"/>
</items>

and I need to dynamically convert it to an array collection as follows (I'm loading the XML externally and the component only allows for an arrayCollection) :

myArray = new ArrayCollection(
[
{ name:"total", value1:35, value2:25, value3:47, value4:89},
{ name:"somesub", value1:15, value2:27, value3:56, value4:43}
]
)

I'm totally stuck on how to do this so any help putting me in the right direction would be highly appreciated.


 
Replies
  • Currently Being Moderated
    Nov 13, 2008 3:29 AM   in reply to woutek
    Two things come to mind:

    You can set the result type to object and let HTTPService to the heavy lifting of converting XML to Objects for you:

    http://blog.flexexamples.com/2007/09/19/converting-xml-to-objects-usin g-the-flex-httpservice-mxml-tag/

    or you receive data as XML and use SimpleXMLDecoder class to convert it into objects and add them to a ArrayCollection

    ATTA
     
    |
    Mark as:
  • Currently Being Moderated
    Nov 26, 2009 2:32 AM   in reply to woutek

    its been a year since there was any activity on this thread so, is the question answered ?

     

    if not... you can you an intermediate array and push elements one by one inside it and the convert this array into arraycollection.

     
    |
    Mark as:
  • Currently Being Moderated
    Jul 20, 2010 4:26 PM   in reply to sagisid

    This works partiallly but it keeps all the XML Node names??  AND WHEN USED WITH A DATAGRID SEARCH iT BLOW UP IN FLEX

     

    so help would still be nice

    myData = new ArrayCollection(mx.utils.ArrayUtil.toArray(xmlStudents));

     

    I found it on:

    http://www.flexdeveloper.eu/forums/actionscript-3-0/converting-xml-to- arraycollection/

     

     

    I ultimately needed it for this code examples:

    HOW TO SEARCH A DATAGRID?

    http://www.flex-blog.com/arraycollection-filter-example/

     

    Thanks.

    Doug Lubey of Louisiana

    www.douglubey.com

     

    SEARCH ENGINE REFERENCE:

    flex4 datagrid search filter 2010

    flex4 datagrid search filter columns

    flex4 datagrid example with search filters

    adobe flex4 convert fx:XMLList to arraylist

    flex4 convert XMLList to arraylist

    flashbuilder4 convert xml to arraylist

    flex xml to arraylist

    convert xmllist to arraycollection in flex

    Implicit coercion of a value of type XMLList to an unrelated type mx.collections:ArrayList

     
    |
    Mark as:
  • Currently Being Moderated
    Jul 20, 2010 11:47 PM   in reply to woutek

    Hi,

     

    Here is the code which converts XMLList to an arraycollection...

     

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();" layout="absolute">
    <mx:Script>
      <![CDATA[
       import mx.collections.ArrayCollection;
       import mx.rpc.xml.SimpleXMLDecoder;
      
       private var acAllNodes:ArrayCollection;
       private var acOpenNodes:ArrayCollection;
      
       private function init():void
       {
        convertXmlListToArrayCollection();
       }
       private function convertXmlListToArrayCollection():void
       {
        var strXML:String = dpNodes.toXMLString();
        strXML = "<root>" + strXML + "</root>";
        var xml:XML = new XML(strXML);
        var xmlDoc:XMLDocument = new XMLDocument(xml);
        var decoder:SimpleXMLDecoder = new SimpleXMLDecoder(true);
        var resultObj:Object = decoder.decodeXML(xmlDoc);
        acAllNodes = new ArrayCollection();
       
        if(resultObj.root.hasOwnProperty("items"))
        {
         if(resultObj.root.items is ArrayCollection)
         {
          acAllNodes = resultObj.root.items;
         }
         else if(resultObj.root.items is Object)
         {
          acAllNodes.addItem(resultObj.root.items);
         }
        }   
       }
      ]]>
    </mx:Script>
     
    <mx:XMLListCollection id="dpNodes">
            <mx:source>
                <mx:XMLList>
                    <items name="total">
        <item name="value1" percentage="35"/>
        <item name="value2" percentage="25"/>
        <item name="value3" percentage="47"/>
        <item name="value4" percentage="89"/>
        </items>
        <items name="somesub">
        <item name="value1" percentage="15"/>
        <item name="value2" percentage="27"/>
        <item name="value3" percentage="56"/>
        <item name="value4" percentage="43"/>
        </items>
                </mx:XMLList>
            </mx:source>
        </mx:XMLListCollection>

     

    </mx:Application>

     

    If this post answers your question or helps, please kindly mark it as such.


    Thanks,

    Bhasker Chari

     
    |
    Mark as:
  • Currently Being Moderated
    Jul 21, 2010 12:28 PM   in reply to BhaskerChari

    Bhasker,

     

    YES your solution worked...thanks.

         It does appear to be customized for each Xml document which uses different node names.  Took me 5 minutes to figure out your XML Set started with "items" where as mine started with "student"...thanks.

     

    other than it worked perfectly:

     

     

    var strXML:String = xmlStudents.toXMLString();

    strXML =

    "<root>" + strXML + "</root>";

     

    //Alert.show(strXML, 'Alert Box', mx.controls.Alert.OK);

     

     

    var xml:XML = new XML(strXML);

     

    var xmlDoc:XMLDocument = new XMLDocument(xml);

     

    var decoder:SimpleXMLDecoder = new SimpleXMLDecoder(true);

     

    var resultObj:Object = decoder.decodeXML(xmlDoc);

    myData =

    new ArrayCollection();

     

    if(resultObj.root.hasOwnProperty("student"))

    {

     

    if(resultObj.root.student is ArrayCollection)

    {

    myData = resultObj.root.student;

    }

     

    else if(resultObj.root.student is Object)

    {

    myData.addItem(resultObj.root.student);

    }

    }

     

    HERE IS MY fx:XMLLIST I based

     

    <fx:XMLList id="xmlStudents">

         <student>

         <id>1</id>

         <name>Christina Coenraets</name>

         <phone>555-219-2270</phone>

         <email>ccoenraets@fictitious.com</email>

         <active>true</active>

         <image>images/arrow_icon_sm1.png</image>

         </student>

    </fx:XMLList>

     
    |
    Mark as:
  • Currently Being Moderated
    Jul 21, 2010 10:13 PM   in reply to AICC

    Hi AICC,

     

    I am glad it worked for you....Have a happy coding..

     

     

    Thanks,

    Bhasker

     
    |
    Mark as:
  • Currently Being Moderated
    Jun 5, 2011 4:22 PM   in reply to BhaskerChari

    How i can do. if i want also childern from xml list.

    if i am doing same way you show here and bind with tree its only give me the parent node its not give to me the childerns.

    i stuck with my tree please let me know the solution.

     

    thanks in advanced

     
    |
    Mark as:
  • Currently Being Moderated
    Mar 8, 2012 4:01 AM   in reply to woutek
     
    |
    Mark as:

More Like This

  • Retrieving data ...

Bookmarked By (0)

Answers + Points = Status

  • 10 points awarded for Correct Answers
  • 5 points awarded for Helpful Answers
  • 10,000+ points
  • 1,001-10,000 points
  • 501-1,000 points
  • 5-500 points