前順に遍歴し,XMLをAS 3オブジェクトに解析する.


AS 3のオリジナルXMLツールはまあまあですが、自分で定義したXMLデータをActionScript 3のObjectに解析する必要がある場合があります.
くだらないことは言わないで、コード:
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プロパティの中に配置され、最終的には「ツリー」のようなデータ構造になります.