Класс для преобразования 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
|
--------------------
ГЫ...
|