前順に遍歴し,XMLをAS 3オブジェクトに解析する.
AS 3のオリジナルXMLツールはまあまあですが、自分で定義したXMLデータをActionScript 3のObjectに解析する必要がある場合があります.
くだらないことは言わないで、コード:
次に、テストの例を示します.
説明:
XmlParserのバッグは自分で変更すると宣言していますが、難しいはずです.
FlashBuilderのプロジェクトです.Flex 3の場合は、テストコードのラベルを自分で変更してください.
例の効果は次のとおりです.
サブノードはchildrenプロパティの中に配置され、最終的には「ツリー」のようなデータ構造になります.
くだらないことは言わないで、コード:
package com.linkage.cmp.serialization.xml{
/**
* , xml AS3 。
* : XML , XML , 。
* @author [email protected]
* @since 2011-01-18
*/
public class XmlParser{
/**
* :
*/
private static var stack:Array=[];
public function XmlParser(){
throw new Error(" XmlParser");
}
public static function parse(obj:*):*{
var result:Object=null;
try{
if(!obj){
return result;
}
if(!(obj is XML)){
obj=new XML(obj.toString());
}
//
stack=[];
doParse(obj);
result=stack[0];
}catch(e:Error){
throw new Error("Xml2Obj XML ");
}
return result;
}
/**
* ,
*/
private static function doParse(root:XML):void{
var obj:Object={name:root.name().toString(),children:[]};
stack.push(obj);
//
var attrLen:int=root.attributes().length();
for(var j:int=0;j<attrLen;j++){
var attr:XML=root.attributes()[j];
obj[attr.name().toString()||"_temp"]=attr.toString();
}
//
var len:int=root.children().length();
if(len){
for(var i:int=0;i<len;i++){
var sub:XML=root.children()[i];
var subLen:int=sub.children().length();
if(subLen){
doParse(sub);
var temp:Object=stack.pop();
var temp2:Object=stack[stack.length-1];
temp2.children.push(temp);
}else{
var top:Object=stack[stack.length-1];
delete top.children;
// top[top.name]=sub.toString();
// delete top.name;
top.value=sub.toString();
}
}
}
}
}
}
次に、テストの例を示します.
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<s:layout>
<s:BasicLayout/>
</s:layout>
<fx:Declarations>
<!-- ( 、 ) -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import com.linkage.cmp.serialization.json.JSON;
import com.linkage.cmp.serialization.xml.XmlParser;
private function test():void{
// , XML ,
var xml:XML=<root>
<name> </name>
<age>25</age>
<skills>
<skill>AS3</skill>
<skill>C++</skill>
<skill>Java</skill>
</skills>
</root>;
var obj:Object=XmlParser.parse(xml);
trace(JSON.encode(obj));
// : XML
var str:String="<root type='001' attr2='002'><node> </node></root>";
var obj2:Object=XmlParser.parse(str);
trace(JSON.encode(obj2));
}
]]>
</fx:Script>
<s:Button click="test()" label="test">
</s:Button>
</s:Application>
説明:
XmlParserのバッグは自分で変更すると宣言していますが、難しいはずです.
FlashBuilderのプロジェクトです.Flex 3の場合は、テストコードのラベルを自分で変更してください.
例の効果は次のとおりです.
{"children":[{"name":"name","value":" "},{"name":"age","value":"25"},{"children":[{"name":"skill","value":"AS3"},{"name":"skill","value":"C++"},{"name":"skill","value":"Java"}],"name":"skills"}],"name":"root"}
{"type":"001","children":[{"name":"node","value":" "}],"name":"root","attr2":"002"}
サブノードはchildrenプロパティの中に配置され、最終的には「ツリー」のようなデータ構造になります.