数组转换成具有层次关系的xml

来源:互联网 发布:c语言成绩管理系统思路 编辑:程序博客网 时间:2024/06/05 14:23

有这么一个情景:从数据库传一个数组到前端,该数组的值具有父子关系,需要将该数组的值抽取出来构造成为一个具有相应层次的xml。 假定该数组值为:private var menuArr:ArrayCollection=new ArrayCollection([{id: 0, parentId: "", label: "顶级菜单"}, {id: 1, parentId: 0, label: "一级菜单1"}, {id: 2, parentId: 0, label: "一级菜单2"}, {id: 3, parentId: 1, label: "二级菜单11"}, {id: 4, parentId: 1, label: "二级菜单12"}, {id: 5, parentId: 2, label: "二级菜单21"}, {id: 6, parentId: 2, label: "二级菜单22"}]); 很明显的,数据当中的id和parentId具有父子关系,可以根据依赖关系确定父子。 首先,我们需要循环遍历该数组; 其次,我们还需要将属性逐个取出,并且构造相应的xml; 最后,我们必须将这些xml再拼装组合成为一个完整的xml; 其中一个比较难以解决的问题在于如何将一个对象的所有属性和值完整取出,拼装成xml的属性值。解决方法是使用ObjectUtil工具类。 怎么样将部分的xml拼装成一个完整的xml也是一个问题。这里我采用的是前序遍历(递归)的方法。 关键代码参考如下: [Bindable] private var xml:XML; //抽取属性,构造xml,拼装xml,返回xml的字符串; private function generateXml(arr:ArrayCollection):String { var xmlStr:String=""; var xmlArr:Array=new Array(); //将属性以及值抽取出来,构造xml; for (var i:int=0; i < arr.length; i++) { var obj:Object=arr.getItemAt(i) var object:Object=ObjectUtil.getClassInfo(obj); var attributesArr:Array=object.properties; var attriString:String=""; attriString+=""; var tempXml:XML=new XML(attriString); xmlArr.push(tempXml); } xml=xmlArr[0] as XML; if (xmlArr.length > 1) { for (i=1; i < xmlArr.length; i++) { var element:XML=xmlArr[i] as XML; var idStr:String=xml.@id; var parentId:String=element.@parentId if (idStr == parentId) { xml.appendChild(element); } appendXml(xml, element); } } trace(xml.toXMLString()); return xmlStr; } //插入xml,规则是当前xml的parentId等于被插入的xml的id; private function appendXml(soureXml:XML, targetXml:XML):void { if (!soureXml) { return; } for each (var xml:XML in soureXml.children()) { var idStr:String=xml.@id; var parentIdStr:String=targetXml.@parentId if (idStr == parentIdStr) { xml.appendChild(targetXml); break; } appendXml(xml, targetXml); } } 最终构造出来的xml如下: 封装类: /************************************************* **** **** 黄记新,2010-12-14,下午03:43:03 **** ************************************************/ package { import mx.collections.ArrayCollection; import mx.utils.ObjectUtil; public class ArrayToMenuUtil { public function ArrayToMenuUtil(pClass:PriClass) { throw new Error("This class can't be insantiated"); } //抽取属性 public static function generateXml(arr:ArrayCollection):String { var xml:XML; var xmlStr:String=""; //存储xml的临时数组; var xmlArr:Array=new Array(); //将属性以及值抽取出来,构造xml; for (var i:int=0; i < arr.length; i++) { var obj:Object=arr.getItemAt(i) var object:Object=ObjectUtil.getClassInfo(obj); var attributesArr:Array=object.properties; var attriString:String=""; attriString+=""; var tempXml:XML=new XML(attriString); xmlArr.push(tempXml); } xml=xmlArr[0] as XML; if (xmlArr.length > 1) { for (i=1; i < xmlArr.length; i++) { var element:XML=xmlArr[i] as XML; var idStr:String=xml.@id; var parentId:String=element.@parentId; if (idStr == parentId) { xml.appendChild(element); } appendXml(xml, element); } } return xml.toXMLString(); } //插入xml,规则是当前xml的parentId等于被插入的xml的id; private static function appendXml(soureXml:XML, targetXml:XML):void { if (!soureXml) { return; } for each (var xml:XML in soureXml.children()) { var idStr:String=xml.@id; var parentIdStr:String=targetXml.@parentId if (idStr == parentIdStr) { xml.appendChild(targetXml); break; } appendXml(xml, targetXml); } } } } class PriClass { public function PriClass() { } } /************************************************* **** **** 黄记新,2010-12-14,下午03:43:03 **** ************************************************/ package com.kingdee.kbi.common.utils { import mx.collections.ArrayCollection; import mx.utils.ObjectUtil; public class ArrayToMenuUtil { public function ArrayToMenuUtil(pClass:PriClass) { throw new Error("This class can't be insantiated"); } //抽取属性 public static function generateXml(arr:ArrayCollection):XML { var xml:XML; var xmlStr:String=""; //存储xml的临时数组; var xmlArr:Array=new Array(); //将属性以及值抽取出来,构造xml; for (var i:int=0; i < arr.length; i++) { var obj:Object=arr.getItemAt(i) var object:Object=ObjectUtil.getClassInfo(obj); var attributesArr:Array=object.properties; var attriString:String=""; attriString+=""; var tempXml:XML=new XML(attriString); xmlArr.push(tempXml); } xml=xmlArr[0] as XML; if (xmlArr.length > 1) { for (i=1; i < xmlArr.length; i++) { var element:XML=xmlArr[i] as XML; var idStr:String=xml.@id; var parentId:String=element.@parentId; if (idStr == parentId) { xml.appendChild(element); } appendXml(xml, element); } } return xml; } //插入xml,规则是当前xml的parentId等于被插入的xml的id; private static function appendXml(soureXml:XML, targetXml:XML):void { if (!soureXml) { return; } for each (var xml:XML in soureXml.children()) { var idStr:String=xml.@id; var parentIdStr:String=targetXml.@parentId if (idStr == parentIdStr) { xml.appendChild(targetXml); break; } appendXml(xml, targetXml); } } //////////////////////////////////////////////////////////////////////////////////////// public static function generateXml2(arr:ArrayCollection):XML { var xml:XML=new XML(""); var xmlStr:String=""; //存储xml的临时数组; var xmlArr:Array=new Array(); //将属性以及值抽取出来,构造xml; for (var i:int=0; i < arr.length; i++) { var obj:Object=arr.getItemAt(i) var object:Object=ObjectUtil.getClassInfo(obj); var attributesArr:Array=object.properties; var attriString:String=""; attriString+=""; var tempXml:XML=new XML(attriString); xmlArr.push(tempXml); } if (xmlArr.length > 0) { for (i=0; i < xmlArr.length; i++) { var element:XML=xmlArr[i] as XML; var parentId:String=element.@parentId; if ("" == parentId || "null" == parentId) { xml.appendChild(element); } continue; appendXml(xml, element); } } return xml; } } } class PriClass { public function PriClass() { } }

原创粉丝点击