Converting XML to objects using the Flex SimpleXMLDecoder class

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.

23 thoughts on “Converting XML to objects using the Flex SimpleXMLDecoder class

  1. how do attributes get filled in on the objects ?

    for instance

    if i’ll One

    can i access it by resultObj.album.id ?

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

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

  3. 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

  4. 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!

  5. 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?

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

    any solution?

    -rc

  7. 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.

      1. You’re the new hotness :P Is there any downside to using the new XML class over the XMLDocument class?

  8. 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.

    1. @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

  9. 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 ..

Comments are closed.