在上一篇文章中我已经说明了使用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文件载入情况:
图形界面生成情况: