Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 3 > WDDXDecoder


Автор: AntonioBanderaz 2.11.2006, 11:52
Класс для преобразования WDDX пакета в объект ActionScript
Код

package com.avelichko.net.xml
{
    import com.avelichko.lang.util.ArrayList;
    import com.avelichko.lang.util.Map;
    import com.avelichko.lang.util.HashMap;
        
    public class WDDXDecoder
    {
        private var retObject:Map = null;
        
        public function WDDXDecoder(xml:XML) {       
            var dataList:XMLList = xml.child("data");
            var varsList:XMLList = dataList.child("struct");
            for each(var node:XML in varsList) {
                retObject = HashMap(unserializeNode(node));
            }
        }

        private function unserializeNode(node:XML):Object {
            var nodeType:String = node.name().toString().toLowerCase();
            var childs:XMLList = node.children();
            var child:XML = null;
            switch (nodeType) {
                case "number" :
                    return Number(node.child(0).toString());
                    break;
                case "boolean" :
                    return node.child(0).toString().toLowerCase() == "true";           
                    break;
                case "string" :
                    return node.child(0).toString();
                    break;
                case "array" :
                    var al:Collection = new ArrayList();
                    for each(child in childs) {
                     al.add(unserializeNode(child));
                    }
                    return al;
                    break;
                case "struct" :
                    var map:Map = new HashMap(); 
                    for each(child in childs) {
                        if (child.name().toString().toLowerCase() == "var") {
                         if(child.attribute("name").length() > 0) {
                             map.put(child.attribute("name")[0].toString().toLowerCase(), unserializeNode(child.child(0)[0])); 
                         }
                        }
                    }
                    return map;
                    break;
                default :
                    return null;
            }
            return null;
        }
        
        public function getASObject():Map {
         return retObject;
        }
    }
}


Пример использхования
Код

                        var testXML:XML = 
            <wddxpacket>
                <data>
                    <struct>
                        <var name="aaa"><boolean value="true" /></var>
                        <var name="sss"><string>dfg</string></var>
                        <var name="vvv"><number>123</number></var>
                        <var name="kkkf">
                            <array length="6">
                               <number>12</number>
                               <string>ewrwe</string>
                               <number>234</number>
                               <number>456</number>
                               <number>5676</number>
                               <number>78</number>
                            </array>
                        </var>
                     </struct>
                </data>
            </wddxpacket>;
            
            var wddxDec:WDDXDecoder = new WDDXDecoder(testXML);
            var ret:Map = wddxDec.getASObject();
            var it:Iterator = ret.keyList().iterator();
            while(it.hasNext()) {
                var o:Object = it.next();
                trace("Ключ " + o.toString());
                trace("\tЗначение " + ret.getEntry(o).toString());
                trace("\tТип " + typeof(ret.getEntry(o)));
                if(ret.getEntry(o) instanceof ArrayList) {
                    trace("\tМассив");
                    var li:Iterator = ArrayList(ret.getEntry(o)).iterator();
                    while(li.hasNext()) {
                        var oa:Object = li.next();
                        trace("\t\tЗначение " + oa.toString());
                        trace("\t\tТип " + typeof(oa));
                    }
                }
            }


На выходк получаем
Код

Ключ aaa
    Значение false
    Тип boolean
Ключ sss
    Значение dfg
    Тип string
Ключ vvv
    Значение 123
    Тип number
Ключ kkkf
    Значение [object ArrayList]
    Тип object
    Массив
        Значение 12
         Тип number
        Значение ewrwe
         Тип string
        Значение 234
         Тип number
        Значение 456
         Тип number
        Значение 5676
         Тип number
        Значение 78
         Тип number

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)