请允许我重新开个贴子,重头整理了一下代码,还是不知道问题出在哪里……
时间:2011-01-19
来源:互联网
请允许我重新开个贴子,重头整理了一下代码,还是不知道问题出在哪里——关于XML节点生成的。
这个二维数组是从数据库生成的的一个文件,我在FLASH中从外部文件将它读取了进来。然后需要生成如图所示的效果,因为每个节点在读取时带有自身的属性(里面用黑色的1、2、3、4……表示了),所以元素节点的位置不能重排;第二维表示元素的层级深度,每个元素的层级深度都是已知的(里面用红色的0、1、2、3、4……表示了)。
var _array = [["A1", 0], ["B1", 1], ["C1", 2], ["B2", 1], ["C2", 2], ["C3", 2], ["D1", 3], ["D2", 3], ["E1", 4], ["B3", 1], ["A2", 0], ["B4", 1]];
今天已经是被折磨的第三天了,自己写的代码,还是不知道错在哪里,真是连猜带蒙的。
(我的算法是当前元素的深度与前一次元素的深度相比较,如果深度变大,就让它成为上一个节点的子节点;如果深度一样大,那么和前一次的元素是并列关系的节点;如果深度为负数,那么和前一次元素的某个父级点是并列关系的节点;可是写出来的代码输出后,还是并非我想要的效果。)
如果可以还是请大家帮忙指正,用AS2或3都没有关系,语法我自己可以转换的;或者请帮我指出我上面的算法错在哪里(以我的智商实在想不出这算法错在哪里)
var _xml:XML = new XML();
var last_level = 0;//上一次层级深度
var now_level = 0;//现在的层级深度
var distance_level = 0;//二次相差几个层级深度
var _node = _xml;//上一次被处理过的XML节点
var _array = [["A1", 0], ["B1", 1], ["C1", 2], ["B2", 1], ["C2", 2], ["C3", 2], ["D1", 3], ["D2", 3], ["E1", 4], ["B3", 1], ["A2", 0], ["B4", 1]];
for (var i = 0; i<_array.length; i++) {
//读取第一个元素
var temp_element = _array[i][0];
//创建元素
var temp_node:XMLNode = _xml.createElement(temp_element);
//创建深度
now_level = _array[i][1];
distance_level = now_level-last_level;
//设置路径
setNode(_node,temp_node);
//上一次层级深度
last_level = now_level;
}
trace(_xml);
function setNode(xml_node, temp_node) {
if (distance_level>0) {
for (var i = 0; i<distance_level; i++) {
_node = _node.childNodes[i];
}
} else if (distance_level<0) {
for (var i = 0; i<Math.abs(distance_level); i++) {
_node = _node.parentNode;
}
}
_node.appendChild(temp_node);
}
生成后的节点并非如我所愿……
<A1>
<B1>
<C1>
<D1>
<E1 />
</D1>
<D2 />
</C1>
<C2 />
<C3 />
</B1>
<B2 />
<B3 />
<B4 />
</A1>
<A2 />
[ 本帖最后由 hglgsxy 于 2011-1-19 15:41 编辑 ]
这个二维数组是从数据库生成的的一个文件,我在FLASH中从外部文件将它读取了进来。然后需要生成如图所示的效果,因为每个节点在读取时带有自身的属性(里面用黑色的1、2、3、4……表示了),所以元素节点的位置不能重排;第二维表示元素的层级深度,每个元素的层级深度都是已知的(里面用红色的0、1、2、3、4……表示了)。
var _array = [["A1", 0], ["B1", 1], ["C1", 2], ["B2", 1], ["C2", 2], ["C3", 2], ["D1", 3], ["D2", 3], ["E1", 4], ["B3", 1], ["A2", 0], ["B4", 1]];
今天已经是被折磨的第三天了,自己写的代码,还是不知道错在哪里,真是连猜带蒙的。
(我的算法是当前元素的深度与前一次元素的深度相比较,如果深度变大,就让它成为上一个节点的子节点;如果深度一样大,那么和前一次的元素是并列关系的节点;如果深度为负数,那么和前一次元素的某个父级点是并列关系的节点;可是写出来的代码输出后,还是并非我想要的效果。)
如果可以还是请大家帮忙指正,用AS2或3都没有关系,语法我自己可以转换的;或者请帮我指出我上面的算法错在哪里(以我的智商实在想不出这算法错在哪里)

var _xml:XML = new XML();
var last_level = 0;//上一次层级深度
var now_level = 0;//现在的层级深度
var distance_level = 0;//二次相差几个层级深度
var _node = _xml;//上一次被处理过的XML节点
var _array = [["A1", 0], ["B1", 1], ["C1", 2], ["B2", 1], ["C2", 2], ["C3", 2], ["D1", 3], ["D2", 3], ["E1", 4], ["B3", 1], ["A2", 0], ["B4", 1]];
for (var i = 0; i<_array.length; i++) {
//读取第一个元素
var temp_element = _array[i][0];
//创建元素
var temp_node:XMLNode = _xml.createElement(temp_element);
//创建深度
now_level = _array[i][1];
distance_level = now_level-last_level;
//设置路径
setNode(_node,temp_node);
//上一次层级深度
last_level = now_level;
}
trace(_xml);
function setNode(xml_node, temp_node) {
if (distance_level>0) {
for (var i = 0; i<distance_level; i++) {
_node = _node.childNodes[i];
}
} else if (distance_level<0) {
for (var i = 0; i<Math.abs(distance_level); i++) {
_node = _node.parentNode;
}
}
_node.appendChild(temp_node);
}
生成后的节点并非如我所愿……
<A1>
<B1>
<C1>
<D1>
<E1 />
</D1>
<D2 />
</C1>
<C2 />
<C3 />
</B1>
<B2 />
<B3 />
<B4 />
</A1>
<A2 />
[ 本帖最后由 hglgsxy 于 2011-1-19 15:41 编辑 ]
作者: hglgsxy 发布时间: 2011-01-19
http://bbs.blueidea.com/viewthread.php?tid=3010846&highlight=
http://bbs.blueidea.com/viewthread.php?tid=3010981&highlight=
http://bbs.blueidea.com/viewthread.php?tid=3010981&highlight=
作者: flash023 发布时间: 2011-01-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28