在上一篇文章中我已经说明了使用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.总结
程序的主题思想是:
1)根据XML文件中的ID属性,过滤出相应节点信息的XML对象,
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文件载入情况:
图形界面生成情况: