<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
    <mx:Text width="400">
        <mx:text>
        <![CDATA[XML Reader v0.1
        
Enter the url of any Flash accessable xml source. The tree below will represent the structure of the returned XML.
            ]]>
        </mx:text>
    </mx:Text>
    <mx:HTTPService resultFormat="e4x" id="xmlLoader"/>
    <mx:HBox width="400">
        <mx:TextInput width="300" id="txt"/>
        <mx:Button label="Load XML" id="bttn" click="onClick()"/>
    </mx:HBox>
    <mx:Tree width="400" height="600" dataProvider="{xmlLoader.lastResult}"  
        showRoot="true" labelFunction="getLabel" iconFunction="getIcon"/>
    <mx:Script>
        <![CDATA[
            import mx.messaging.management.Attribute;
            import mx.rpc.events.ResultEvent;
            
            [Bindable]
            private var loadedXML:XML;
        
            [Embed(source="/assets/action_forward.gif")]
            private var att_icon:Class;
            
            [Embed(source="/assets/page_code.gif")]
            private var node_icon:Class;
            
            private function onClick():void{
                xmlLoader.url = txt.text;
                xmlLoader.send();
                xmlLoader.addEventListener(ResultEvent.RESULT, onComplete);
            }
            
            private function onComplete(e:Event):void{
                var x:XML= xmlLoader.lastResult as XML;
                addAttributes(x);
                loadedXML=x;
            }
            
            private function addAttributes(x:XML):void{
                var allChildren:XMLList = x.children();
                for(var i:Number=0; i<allChildren.length();i++){
                    var c:XML = XML(allChildren[i]);
                    var atts:XMLList = c.attributes();
                    if(atts.length()>1){
                        var ax:XML = <__attributes></__attributes>;
                        for(var j:Number=0;j<atts.length(); j++){
                            ax.appendChild(XML("<"+atts[j].name()+">"+atts[j].toString()+"</"+atts[j].name()+">"));
                        }
                        c.appendChild(ax);
                    }
                    addAttributes(c);
                }
            }
            
            private function getLabel(o:Object):*{
                var name:String = o.name();
                if(name){
                    return name;
                }
                return o;
            }
            
            private function getIcon(item:Object):Class{
                var x:XML = item as XML;
                if(x && x.parent()){
                    if(x.parent().name()=="__attributes"){
                        return att_icon;
                    }
                }
                if(x.children().length()==0){
                    return null;
                }
                return node_icon;
            }
        ]]>
    </mx:Script>
</mx:Application>