Flex As3 解析XML文件(下:个人程序代码标记)
在上一篇文章中我已经说明了使用Flex As3处理XML文件的基本方法,下面就本人所写过的程序,作下代码标记。 1.XML文件的读取部分此处不再详述; 2.具体XML文件解析 在上一篇文章中的onFileComplete函数中调用了myDrawBoard.ParseFromXml()函数,具体的parseFromXml函数的代码如下: public function ParseFromXml(iXML:XML): void{ this.Clear(); parseNode(iXML); parseRoute(iXML); } 对于这段代码: 1).首先说明myDrawBoard函数式程序中个人封装的类,继承于Canvas,主要用于实现相关流程图形的绘制; 2).调用this.Clear()清空所有Canvas上现在存在的图形; 3).parseNode()用于解析控件节点; 4).parseRoute()用于解析路由线对象; 3.parseNode(iXML:XML)函数 //解析节点信息 public function parseNode(iXML:XML):void { var newElementClass : Class var myelement:Element; var domain : ApplicationDomain = ApplicationDomain.currentDomain; var elementName:String=""; var i:int; //先解析Node节点 //获得当前节点的ID值(唯一属性)序列 var comList:XMLList=iXML.Node.attribute("ID"); for each (var comXml:XML in comList) { var currId:String=comXml.toString(); var tmpAttrList:XMLList=iXML.Node.(@ID==currId); //Alert.show(tmpAttrList); //读出当前ID值节点的属性序列 //var tmpAttrList:XMLList=iXML.Node.(@ID==currId).attributes(); //构造当前解析节点所需的XML for each (var tmpXml:XML in tmpAttrList) { //Alert.show(tmpXml); elementName="wf."+tmpXml.@type; if(domain.hasDefinition(elementName)) { //动态创建类对象 newElementClass = domain.getDefinition(elementName) as Class; myelement = new newElementClass(this,tmpXml); //绘制当前节点 if(myelement is EndNode) { var endNode:EndNode=myelement as EndNode; endNode.Draw(tmpXml.@x,tmpXml.@y); } if(myelement is BeginNode) { var beginNode:BeginNode=myelement as BeginNode; beginNode.Draw(tmpXml.@x,tmpXml.@y); } if(myelement is ForkNode) { var forkNode:ForkNode=myelement as ForkNode; forkNode.Draw(tmpXml.@x,tmpXml.@y); } if(myelement is JoinNode) { var joinNode:JoinNode=myelement as JoinNode; joinNode.Draw(tmpXml.@x,tmpXml.@y); } if(myelement is TaskNode) { var taskNode:TaskNode=myelement as TaskNode; taskNode.Draw(tmpXml.@x,tmpXml.@y); } if(myelement is WorkNode) { var workNode:WorkNode=myelement as WorkNode; workNode.Draw(tmpXml.@x,tmpXml.@y); } } } } } 4.parseRoute(iXML:XML)函数 //解析路由线 public function parseRoute(iXML:XML):void { var routeList:XMLList=iXML.Route.attribute("ID"); for each (var routeXml:XML in routeList) { //Alert.show(routeXml); var routeId:String=routeXml.toString(); //读出当前ID值路有线的属性序列 var tmpRouteList:XMLList=iXML.Route.(@ID==routeId).attributes(); var tmpRouteXml:XML=new XML("<Route/>"); for each (var tmpRouteAttr:XML in tmpRouteList) { if(tmpRouteAttr.name()=="ID") { tmpRouteXml.@ID=tmpRouteAttr.toString(); } if(tmpRouteAttr.name()=="Name") { tmpRouteXml.@Name=tmpRouteAttr.toString(); } if(tmpRouteAttr.name()=="FromElementID") { tmpRouteXml.@FromElementID=tmpRouteAttr.toString(); } if(tmpRouteAttr.name()=="ToElementID") { tmpRouteXml.@ToElementID=tmpRouteAttr.toString(); } } var tmpRoute:Route=new Route(this,tmpRouteXml); } } 4.总结 程序的主题思想是: 2)根据XML对象的type属性new出相应封装好的类对象,这里用到了import flash.system.ApplicationDomain;类来获得当前程序的所有类域; 3)然后将相应xml信息对象作为参数传递给相应对象的解析函数,从而初始化新建对象的相应属性例如对于TaskNode类对象的解析调用如下函数: override public function ParseFromXml(iXML:XML): int{ //解析节点属性 this.ID=iXML.@ID; this.x=iXML.@x; this.y=iXML.@y; this.maxTaskID=iXML.@taskNum; //解析子节点信息 this.Name=iXML.Name; this.NodeType=iXML.NodeType; //设置当前节点的xml属性 this.xml=iXML; this.Draw(this.x,this.y); return 0; } 5.程序运行结果: XML文件载入情况: 图形界面生成情况: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |