Search code examples
actionscript-3apache-flexflex4flash-builder4.5

Dynamic XML with flex


I'm trying to build a type of query GUI, which returns queries from a php script in xml format via an httpservice. Each query returns different results eg.

  1. rep with most and leat quotes
  2. store with highest $ value

I'm really stuck on how to display the queries and access the node names and values. Here's an example of an xml:

<node>
<action>query</action>
<quotes name="Most Quotes">
<first>John</first>
<last>Smith</last>
<quote_num>71</quote_num>
</quotes>
<quotes name="Least Quotes">
<first>Dave</first>
<last>Cook</last>
<quote_num>6</quote_num>
</quotes>
</node>

Id like to present the data in a readable way. Thanks


Solution

  • Here the example code for read your XML (it works perfectly):

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init()" horizontalAlign="center">
    <mx:Script>
        <![CDATA[
            import mx.collections.XMLListCollection;
            import mx.utils.ObjectUtil;
            private var tempXML:XML;
    
            public function init():void{
                tempXML = myXML;
                txtA.text = myXML.toString();
                readXml();
            }
    
            public function readXml():void{
                var str:String = "";
    
                var myXML:XMLList = new XMLList(myXML);
                for each(var node:XML in myXML){
                    str = str + "action:" + node["action"] + "\n";
                    for each(var obj2:XML in  node.quotes){
                        str = str + "    name:" + obj2.attributes().toXMLString() + "\n";
                        str = str + "        first:" + obj2["first"] + "\n";
                        str = str + "        first:" + obj2["last"] + "\n";
                        str = str + "        quote_num:" + obj2["quote_num"] + "\n";
                    }
                    txtB.text = str;
                }
            }
        ]]>
    </mx:Script>
    <mx:XML id="myXML">
        <node>
            <action>query</action>
            <quotes name="Most Quotes">
                <first>John</first>
                <last>Smith</last>
                <quote_num>71</quote_num>
            </quotes>
            <quotes name="Least Quotes">
                <first>Dave</first>
                <last>Cook</last>
                <quote_num>6</quote_num>
            </quotes>
        </node>
    </mx:XML>
    <mx:HBox width="100%">
        <mx:TextArea id="txtA" width="400" height="400" />
        <mx:TextArea id="txtB" width="400" height="400" />
    </mx:HBox>
    

    Note: This code was created in actionscript 3, but should also work in your version. Please try it and tell me if will be useful, otherwise I'll have to post a code for your version. Remember that there are many ways to do this, i posted this way because maybe is more simple.

    You can try this HERE.

    Please visit this link for more explanation Working with XML

    Second Version

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init()" horizontalAlign="center">
    <mx:Script>
        <![CDATA[
            import mx.collections.XMLListCollection;
            import mx.utils.ObjectUtil;
            private var tempXML:XML;
    
            public function init():void{
                tempXML = myXML;
                txtA.text = myXML.toString();
                readXml();
            }
    
            public function readXml():void{
                var str:String = "";
                var quotes:XMLList = myXML.quotes;
                str = str + "action:" + myXML["action"] + "\n";
                for (var i:int = 0; i < quotes.length(); i++){
                    str = str + "----quote name:" + XMLList(quotes[i]).attributes().toXMLString() + "\n";
                    var quotes_child:XMLList = quotes[i].children();
                    for (var j:int = 0; j < quotes_child.length(); j++){
                        str = str + "--------" + XML(quotes_child[j]).name() + ":" + quotes_child[j] + "\n";
                    }
                }
                txtB.text = str;
            }
        ]]>
    </mx:Script>
    <mx:XML id="myXML">
        <node>
            <action>query</action>
            <quotes name="Most Quotes">
                <first>John</first>
                <last>Smith</last>
                <quote_num>71</quote_num>
            </quotes>
            <quotes name="Least Quotes">
                <first>Dave</first>
                <last>Cook</last>
                <quote_num>6</quote_num>
            </quotes>
            <quotes name="other">
                <first>other_first</first>
                <last>other_last</last>
                <quote_num>other_num</quote_num>
                <other_property>other_prop</other_property>
            </quotes>           
        </node>
    </mx:XML>
    <mx:HBox width="100%">
        <mx:TextArea id="txtA" width="400" height="400" />
        <mx:TextArea id="txtB" width="400" height="400" />
    </mx:HBox>
    

    You can try this HERE.

    Check that in this new version, I iterate over each child using a "for" statement with increment variable.