加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex高性能xml递归分解

发布时间:2020-12-15 00:57:55 所属栏目:百科 来源:网络整理
导读:? ? ?flex和xml的结合非常精密,本身flex就有xml的对象,所以在开发xml也让人感觉非常方便。但是传统的xml对象的解析下,无法对xml执行sax的操作,要递归出一些具有相同属性的节点相对比较麻烦。传统flex的xml的修改也非常麻烦,比较容易出错。直接上代码吧

? ? ?flex和xml的结合非常精密,本身flex就有xml的对象,所以在开发xml也让人感觉非常方便。但是传统的xml对象的解析下,无法对xml执行sax的操作,要递归出一些具有相同属性的节点相对比较麻烦。传统flex的xml的修改也非常麻烦,比较容易出错。直接上代码吧:

?

package com.shine.framework.core.util
{
	import mx.collections.ArrayCollection;

	public class ArrayMap
	{
		private var entry:ArrayCollection=new ArrayCollection;
		
		public function ArrayMap()
		{
		}
		
		/**
		 * 比较是否存在相同的key
		 * @param key
		 * */
		public function containsKey(key:Object):Boolean{
			var length:int=entry.length;
			var b:Boolean=false;
			for(var i:int=0;i<length;i++){
				var mapValue:MapValue=entry.getItemAt(i) as MapValue;
				if(mapValue.key==key){
					b=true;
					break;
				}
			}
			return b;
		}
		
		/**
		 * 比较是否存在相同的value
		 * @param value
		 * */
		public function containsValue(value:Object):Boolean{
			var length:int=entry.length;
			var b:Boolean=false;
			for(var i:int=0;i<length;i++){
				var mapValue:MapValue=entry.getItemAt(i) as MapValue;
				if(mapValue.value==value){
					b=true;
					break;
				}
			}
			return b;
		}
		
		/**
		 * 存入数据
		 * @param key
		 * @param value
		 * */
		public function put(key:Object,value:Object):void{
			var mapValue:MapValue=null;
			var length:int=entry.length;
			var b:Boolean=true;
			for(var i:int=0;i<length;i++){
				mapValue=entry.getItemAt(i) as MapValue;
				if(mapValue.key==key){
					MapValue(entry.getItemAt(i)).value=value;
					b=false;
					break;
				}
			}
			if(b){
				mapValue=new MapValue;
				mapValue.key=key;
				mapValue.value=value;
				entry.addItem(mapValue);
				mapValue=null;
			}
		}
		
		/**
		 * 根据key获取数据
		 * @param key
		 * */
		public function get(key:Object):Object{
			var length:int=entry.length;
			for(var i:int=0;i<length;i++){
				var mapValue:MapValue=entry.getItemAt(i) as MapValue;
				if(mapValue.key==key){
					return mapValue.value;
				}
			}
			return null;
		}
		
		/**
		 * 获取长度
		 * */
		public function getLength():int{
			return entry.length;
		}
		
		/**
		 * 根据顺序获取key
		 * @param index
		 * */
		public function getKeyByIndex(value:int):Object{
			if(value<entry.length)
				return (entry.getItemAt(value) as MapValue).key;
			return null;
		}
		
		/**
		 * 根据顺序获取value
		 * @param index
		 * */
		public function getValueByIndex(value:int):Object{
			if(value<entry.length)
				return (entry.getItemAt(value) as MapValue).value;
			return null;
		}
		
		/**
		 *获取key的位置
		 *@param key
		 * */
		public function getIndexByKey(key:Object):int{
			if(this.containsKey(key)){
				var length:int=entry.length;
				for(var i:int=0;i<length;i++){
					var mapValue:MapValue=entry.getItemAt(i) as MapValue;
					if(mapValue.key==key){
						return i;
					}
				}
			}
			return 0;
		}
		
		/**
		 *获取首个value的位置
		 *@param value
		 * */
		public function getIndexByValue(value:Object):int{
			if(this.containsValue(value)){
				var length:int=entry.length;
				for(var i:int=0;i<length;i++){
					var mapValue:MapValue=entry.getItemAt(i) as MapValue;
					if(mapValue.value==value){
						return i;
					}
				}
			}
			return 0;
		}
		
		/**
		 *删除该key
		 *@param key
		 * */
		public function removeMapValue(key:Object):void{
			if(this.containsKey(key)){
				entry.removeItemAt(this.getIndexByKey(key));
			}
		}
		
		/**
		 *删除该value
		 *@param value
		 * */
		public function removeMapByValue(value:Object):void{
			if(this.containsValue(value)){
				entry.removeItemAt(this.getIndexByValue(value));
			}	
		}
		
		
		/**
		 * 删除所有数据
		 * */
		public function removeAll():void{
			entry.removeAll();
		}
		
		/**
		 * 获取所有值的数组
		 * */
		public function getValueArray():Array{
			var valueArray:Array=new Array;
			var num:int=this.getLength();
			for(var i:int=0;i<num;i++){
				valueArray.push(this.getValueByIndex(i));
			}
			return valueArray;
		}
	}
}
class MapValue{
	public var key:Object;
	public var value:Object;
}

package com.shine.framework.core.model
{
	import com.shine.framework.core.util.ArrayMap;
	import com.shine.framework.core.util.StringBuffer;
	
	import flashx.textLayout.formats.Float;
	
	import mx.controls.Alert;
	
	/**
	 * Base xml model
	 * 
	 * @author viruscodecn@gmail.com
	 * @project FlexFramework 2.0 2011-01-13
	 */
	public class BaseXmlModel extends ArrayMap
	{
		public var xml:String="";
		public function BaseXmlModel(value:String=null)
		{
			super();
			initXmlValue(value);
		}
		
		/**
		 * 初始xml model的值,把xml节点中所有属性和值存入model
		 * 
		 * value=<node key1="value1" key2="value2" key3="value3" />
		 * */
		public function initXmlValue(value:String):void{
			xml=value;
			this.removeAll();
			var xmlData:XML=XML(value);
			var length:int=xmlData.attributes().length();
			for(var i:int=0;i<length;i++){
				var xmlValue:XML=XML(xmlData.attributes()[i]);
				this.put(xmlValue.name().toString(),xmlValue.toString());
			}
		}
		
		//获取xml的数据结构 <node key1="value1" key2="value2" key3="value3" />
		public function getXmlValue():String{
			var xmlData:StringBuffer=new StringBuffer;
			xmlData.append("<node ");
			var length:int=this.getLength();
			for(var i:int=0;i<length;i++){
				xmlData.append(this.getKeyByIndex(i)+"='"+this.getValueByIndex(i)+"' ");
			}
			xmlData.append("/>");
			return xmlData.toString();
		}
		
		//获取xml的数据结构 <name key1="value1" key2="value2" key3="value3" />
		public function getOriginalXmlValue():String{
			var xmlData:StringBuffer=new StringBuffer;
			xmlData.append("<"+String(XML(this.xml).name())+" ");
			var length:int=this.getLength();
			for(var i:int=0;i<length;i++){
				xmlData.append(this.getKeyByIndex(i)+"='"+this.getValueByIndex(i)+"' ");
			}
			xmlData.append("/>");
			return xmlData.toString();
		}
		
		
		/**
		 * 初始xml model的值,把子节点中的名称做key,值做value
		 * 
		 * value=<node><key1>value1</key1><key2>value2</key2><key3>value3</key3></node>
		 * */
		public function initBaseXmlValue(value:String):void{
			xml=value;
			this.removeAll();
			var xmlData:XML=XML(value);
			for each(var nodeXml:XML in xmlData.children()){
				this.put(nodeXml.name().toString(),nodeXml.toString());
			}
		}
		
		//获取xml的数据结构 <node><key1>value1</key1><key2>value2</key2><key3>value3</key3></node>
		public function getBaseXmlValue():String{
			var xml:XML=XML("<node />");
			var length:int=this.getLength();
			for(var i:int=0;i<length;i++){
				var keyXml:XML=XML("<"+this.getKeyByIndex(i)+">"+this.getValueByIndex(i)+"</"+this.getKeyByIndex(i)+">");
				xml.appendChild(keyXml);
			}
			return xml.toXMLString();
		}
		
		//由key获取String value
		public function getString(key:String):String{
			if(this.get(key)==null)
				return null;
			return String(this.get(key));
		}
		
		//由key获取int value
		public function getInt(key:String):int{
			return int(this.get(key));
		}
		
		//由key获取num value
		public function getNumber(key:String):int{
			return Number(this.getString(key));
		}
		
		//获取xml的name
		public function getName():String{
			return String(XML(this.xml).name());
		}
	}
}

package com.shine.framework.core.util
{
	import com.shine.framework.core.model.BaseXmlModel;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;

	public class XMLArrayCollection extends ArrayCollection
	{
		public function XMLArrayCollection()
		{
		}
		
		/**
		 * 获取所有节点
		 * */
		public function saxXmlNode(value:XML):void{
			var baseXMLModel:BaseXmlModel=new BaseXmlModel;
			baseXMLModel.initBaseXmlValue(value.toXMLString());
			this.addItem(baseXMLModel);	
			baseXMLModel=null;
			
			if(value.children().length()!=0){
				for each(var xml:XML in value.children()){
					saxXmlNode(xml);
				}
			}
		}
		
		/**
		 * 获取所有指定名称的节点
		 * */
		public function saxXmlNodeByTag(value:XML,tag:Array):void{
			if(tag.indexOf(value.name().toString())!=-1){
				var baseXMLModel:BaseXmlModel=new BaseXmlModel;
				baseXMLModel.initXmlValue(value.toXMLString());
				this.addItem(baseXMLModel);
			}

			if(value.children().length()!=0){
				for each(var xml:XML in value.children()){
					saxXmlNodeByTag(xml,tag);
				}
			}
		}
		
		/**
		 * 获取指定的model
		 **/
		public function getBaseXMLModel(value:int):BaseXmlModel{
			return this.getItemAt(value) as BaseXmlModel;
		}
		
	}
}

? ? 在说例子前,我简单给大家解析一下使用逻辑。首先通过递归把xml解析到XMLArrayCollection里面,里面的对象主要是BaseXmlModel。我们简单给大家一个使用例子。

样本xml

<?xml version="1.0" encoding="UTF-8"?>
<BusinessView saveUrl="/GraphicalView.do?method=saveMap&mapId=2">
	<Nodes>
		<Node image="/images/fl/biz.gif" y="37" id="2" message="名称:MyBizView" type="BIZ" name="MyBizView" x="359" />
		<Node image="/images/fl/url_1.gif" y="177" id="10000103" message="名称: www.abc.com<br>类型: Url监视器<br>可用性: 不可用<br>健康度: 告警<br>响应时间: 0ms<br>资源停止. 资源www.abc.com不可用。Host Unavailable:响应码 -200" type="UrlMonitor" name="http://www.abc.com" x="634" />
		<Node image="/images/fl/sys_5.gif" y="248" id="10000038" message="名称: win2008<br>类型: Windows 2000<br>可用性: 可用<br>健康度: 正常<br>响应时间: 1ms" type="Windows 2000" name="afunms-win2008" x="474" />
		<Node image="/images/fl/dbs_5.gif" y="172" id="10000039" message="名称: tbsm<br>类型: DB2-server<br>可用性: 可用<br>健康度: 正常<br>响应时间: 34ms" type="DB2-server" name="IF-afunms-win2008_DB2-server_50000" x="121" />
		<Node image="/images/fl/ser_5.gif" y="262" id="10000100" message="名称: 80.13<br>类型: Ping Monitor<br>可用性: 可用<br>健康度: 正常<br>响应时间: 0ms" type="Ping Monitor" name="80.13" x="141" />
		<Node image="/images/fl/ser_5.gif" y="300" id="10000098" message="名称: 80.130<br>类型: Ping Monitor<br>可用性: 可用<br>健康度: 正常<br>响应时间: 0ms" type="Ping Monitor" name="80.130" x="254" />
		<Node image="/images/fl/url_1.gif" y="215" id="10000104" message="名称: dd<br>类型: Url监视器<br>可用性: 不可用<br>健康度: 告警<br>响应时间: 0ms<br>资源停止. 资源dd不可用。Host Unavailable:响应码 -200" type="UrlMonitor" name="http://www.dd.2" x="535" />
		<Node image="/images/fl/url_1.gif" y="294" id="10000102" message="名称: 163.com<br>类型: Url监视器<br>可用性: 不可用<br>健康度: 告警<br>响应时间: 0ms<br>资源停止. 资源163.com不可用。Host Unavailable:响应码 -200" type="UrlMonitor" name="http://www.163.com" x="355" />
		<Node image="/images/fl/hai_1.gif" y="107" id="10000105" message="名称: MyGroup<br>类型: 监视器组<br>可用性: 不可用<br>健康度: 告警<br>响应时间: -1ms<br>资源MyGroup为停止. 根本原因:资源停止. 资源www.abc.com不可用。Host Unavailable:响应码 -200资源停止. 资源dd不可用。Host Unavailable:响应码 -200资源停止. 资源163.com不可用。Host Unavailable:响应码 -200" type="HAI" name="MyGroup" x="362" />
	</Nodes>
	<Lines>
		<Line end="10000105" color="0xd9D6C3" start="2" />
		<Line end="10000103" color="0xFF0000" start="10000105" />
		<Line end="10000038" color="0xd9D6C3" start="10000105" />
		<Line end="10000039" color="0xd9D6C3" start="10000105" />
		<Line end="10000100" color="0xd9D6C3" start="10000105" />
		<Line end="10000098" color="0xd9D6C3" start="10000105" />
		<Line end="10000104" color="0xFF0000" start="10000105" />
		<Line end="10000102" color="0xFF0000" start="10000105" />
	</Lines>
	<Tree icon="/images/fl/root.gif" name="resourceTree" root="true">
		<node icon="/images/fl/root.gif" name="MyBizView" root="true">
			<node icon="/images/fl/root.gif" name="MyGroup" root="true">
				<node icon="/images/fl/node.gif" name="afunms-win2008" id="10000038" />
				<node icon="/images/fl/node.gif" name="IF-afunms-win2008_DB2-server_50000" id="10000039" />
				<node icon="/images/fl/node.gif" name="80.130" id="10000098" />
				<node icon="/images/fl/node.gif" name="80.13" id="10000100" />
				<node icon="/images/fl/node.gif" name="http://www.163.com" id="10000102" />
				<node icon="/images/fl/node.gif" name="http://www.abc.com" id="10000103" />
				<node icon="/images/fl/node.gif" name="http://www.dd.2" id="10000104" />
			</node>
		</node>
	</Tree>
	<alarms>
		<alarm logTime="2011-12-18 14:13:19" status="严重" alarmImage="/images/fl/status1.gif" group="监视器组" content="资源MyGroup为停止. 根本原因:资源停止. 资源www.abc.com不可用。Host Unavailable:响应码 -200资源停止. 资源dd不可用。Host Unavailable:响应码 -200资源停止. 资源163.com不可用。Host Unavailable:响应码 -200" alias="MyGroup" />
		<alarm logTime="2011-12-18 13:55:44" status="严重" alarmImage="/images/fl/status1.gif" group="Url监视器" content="资源停止. 资源dd不可用。Host Unavailable:响应码 -200" alias="dd" />
		<alarm logTime="2011-12-18 13:55:44" status="严重" alarmImage="/images/fl/status1.gif" group="Url监视器" content="资源停止. 资源www.abc.com不可用。Host Unavailable:响应码 -200" alias="www.abc.com" />
		<alarm logTime="2011-12-18 08:20:25" status="严重" alarmImage="/images/fl/status1.gif" group="Url监视器" content="资源停止. 资源163.com不可用。Host Unavailable:响应码 -200" alias="163.com" />
	</alarms>
</BusinessView>

解析例子

<?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" creationComplete="{complete()}">
	<s:layout>
		<s:BasicLayout/>
	</s:layout>
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			import com.shine.framework.core.util.BaseHttpServiceUtil;
			import com.shine.framework.core.util.XMLArrayCollection;
			import com.shine.framework.core.util.XmlModelArrayCollection;
			
			import mx.controls.Alert;
			
			private var testXmlModelArrayCollertion:XMLArrayCollection=null;
			
			private function complete():void{
				//远程加载xml
				var httpUtil:BaseHttpServiceUtil=new BaseHttpServiceUtil;
				httpUtil.getResultXml("xml/1.xml",xmlResult);
			}
			
			private function xmlResult(xml:String):void{
				//解析所有的Node节点
				testXmlModelArrayCollertion=new XMLArrayCollection;
				testXmlModelArrayCollertion.saxXmlNodeByTag(XML(xml),["Node"]);
				Alert.show(testXmlModelArrayCollertion.getBaseXMLModel(0).getString("image"));
			}
		]]>
	</fx:Script>
</s:Application>

? ?如果希望了解更多相关内容,请查看svn代码

? ? svn地址:http://code.google.com/p/ken-javaframeword/source/browse/#svn%2Ftrunk%2Fframework2.0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读