Similar to the previous post, “Converting XML to objects using the Flex HTTPService MXML tag“, the following example shows how you can use the decodeXML() method in the SimpleXMLDecoder class to convert an XMLDocument object into an ActionScript Object object.

Full code after the jump.

View MXML

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2007/09/19/converting-xml-to-objects-using-the-flex-simplexmldecoder-class/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical"
        verticalAlign="middle"
        backgroundColor="white"
        creationComplete="serv.send();">

    <mx:Script>
        <![CDATA[
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.rpc.xml.SimpleXMLDecoder;

            private function serv_result(evt:ResultEvent):void {
                /* Convert XMLNode to XMLDocument. */
                var xmlStr:String = evt.result.toString();
                var xmlDoc:XMLDocument = new XMLDocument(xmlStr);
                var decoder:SimpleXMLDecoder = new SimpleXMLDecoder(true);
                var resultObj:Object = decoder.decodeXML(xmlDoc);
                /* Assign the values... */
                nameText.text = resultObj.album.name;
                img0Text.text = resultObj.album.images.image[0];
                img1Text.text = resultObj.album.images.image[1];
                img2Text.text = resultObj.album.images.image[2];
            }

            private function serv_fault(evt:FaultEvent):void {
                // Show the error label.
                error.text += evt.fault.faultString;
                error.visible = true;
                // Hide the form.
                form.visible = false;
            }
        ]]>
    </mx:Script>

    <mx:String id="XML_URL">album.xml</mx:String>

    <mx:HTTPService id="serv"
            url="{XML_URL}"
            resultFormat="xml"
            result="serv_result(event);"
            fault="serv_fault(event);" />

    <mx:ApplicationControlBar dock="true">
        <mx:Label text="{XML_URL}" />
    </mx:ApplicationControlBar>

    <mx:Label id="error"
            color="red"
            fontSize="36"
            fontWeight="bold"
            visible="false"
            includeInLayout="{error.visible}"/>

    <mx:Form id="form"
            includeInLayout="{form.visible}">
        <mx:FormItem label="resultObj.album.name:">
            <mx:Label id="nameText" />
        </mx:FormItem>
        <mx:FormItem label="resultObj.album.images.image[0]:">
            <mx:Label id="img0Text" />
        </mx:FormItem>
        <mx:FormItem label="resultObj.album.images.image[1]:">
            <mx:Label id="img1Text" />
        </mx:FormItem>
        <mx:FormItem label="resultObj.album.images.image[2]:">
            <mx:Label id="img2Text" />
        </mx:FormItem>
    </mx:Form>

</mx:Application>

View album.xml

<?xml version="1.0" encoding="utf-8"?>
<album>
    <name>One</name>
    <images>
        <image>image1.jpg</image>
        <image>image2.jpg</image>
        <image>image3.jpg</image>
    </images>
</album>

View source is enabled in the following example.

 
Tagged with:
 
About The Author

Peter deHaan

Peter deHaan currently works for Adobe on the Flex SDK QA team. While not working on Flex, Flash, and ColdFusion applications, Peter enjoys making up bios and writing in 3rd person. Peter's rarely updated blog can be found at blogs.adobe.com/pdehaan/, actionscriptexamples.com, airexamples.com, and coldfusionexamples.com.

23 Responses to Converting XML to objects using the Flex SimpleXMLDecoder class

  1. tim yang says:

    very usefull thanks!!!!1!

  2. duivvv says:

    how do attributes get filled in on the objects ?

    for instance

    if i’ll One

    can i access it by resultObj.album.id ?

  3. marco says:

    creationComplete="serv.send();" ??

    where is the serv.send(); function on the script ?? is it a special code ?

  4. peterd says:

    marco,

    Nope, no special code. Later in the code you should see the following MXML code:

        <mx:HTTPService id="serv"
                url="{XML_URL}"
                resultFormat="xml"
                result="serv_result(event);"
                fault="serv_fault(event);" />
    

    Basically the creationComplete event is calling the HTTPService tag’s send() method, which should trigger the result or fault events which in turn calls the serv_result() or serv_fault() methods.

    Peter

  5. alex says:

    how can i access a with dashes like ? i receive Flex: 1120: Access of undefined property size…

  6. alex says:

    ^^ tag like font-size

  7. mike says:

    good example m8! U really saved me, i was trying to put a variable in the end of the xml invoking string: xmlPath=XmlRequest.lastresult.data.list.path[i] but wasn’t getting anywhere. Ultil i saw your post.
    good job and thnx!

  8. Adam J. says:

    Very useful post. Thank you. Was sick of getting ‘non-bindable’ warnings.

  9. Jacob P says:

    Does this also work with a Number? just convert the String to a Number?

  10. John says:

    i would like to deserialize my xml into a specific object type (rather than Object). Thoughts?
    Thanks !

  11. Tom says:

    Hmm, good example but this class is really bad! if you take a look on the source of the static SimpleXMLDecoder.simpleType function, you can see that String values are just … returned w/o any decoding!

    So this example is good for simple String such as Image URL, but what about XML encoded String?

  12. Marakame says:

    In addition to this you can use CDATA

    Peter thank you for your post. Useful.

  13. rconceiver says:

    hi
    simplexmldecoder returns node as ObjectProxy than arraycollection if there is only one node in parent tag.

    any solution?

    -rc

  14. judah says:

    Should we use XML now instead of XMLDocument?

    3574 Migration issue: The ActionScript 2.0 XML class has been renamed XMLDocument. This is a code migration warning. XML is a different class in ActionScript 3.0 than it was in ActionScript 2.0. In ActionScript 3.0, the XMLDocument class is the equivalent of the XML class in ActionScript 2.0. The ActionScript 3.0 XML class offers improved functionality with an easier and more powerful API. See XML in the ActionScript Language Reference for additional details.

  15. judah says:

    When I say downside I mean that I’m using this code in a Flex preloader so performance and memory wise. I tried using the XML class but couldn’t coerce it to an XMLNode. I timed it using the XMLDocument class and it took only 10ms to parse. I can live that.

    • Peter deHaan says:

      @judah,

      I haven’t done a lot of performance testing on the different XML classes. I just generally stick with the new E4X stuff since parsing large blocks of XML is a lot easier. If you got the XMLDocument/XMLNode solution working you can probably just stick with that, and document your code well so when somebody looks at the project in 3 years they don’t scratch their head wondering what this old ActionScript 2.0-esque XML code is doing in there. :)

      Peter

  16. Doris says:

    Hi,

    Somebody can explain me what’s the meaning of resultObj=[object Object] ?

    Thanks.

  17. henry says:

    i guess there is a method called decode() in the xml class. that decodes the xml data instantly. you do not have to code anything.. just get ur schema and load ur xml and holla the rest is done for ya ..

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Anti-Spam Protection by WP-SpamFree