这里没有用递归算法,而是用JS实现一个堆栈,将数据放入一个堆栈来处理。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
function genTableByXMLData() {
var region = "CNDHN";
var bDate = "20110101";
var eDate = "20111231";
xmlDoc.load("surmise.aspx?region=" + region + "&bDate=" + bDate + "&eDate=" + eDate);
var x = xmlDoc.documentElement;
var tree = new stack();
tree.push(new Node(x, 0));
var tmpNode = null;
while (tree.top > 0) {
if (tree.unit[tree.top - 1].value.hasChildNodes) {
if (tmpNode != null && tmpNode.index == tree.unit[tree.top-1].value.childNodes.length - 1) {
//已遍历孩子,结点弹出堆栈
tmpNode = tree.pop();
alert(tmpNode.value.tagName);
}
else if (tmpNode == null) {
//未有回溯行为
tree.push(new Node(tree.unit[tree.top-1].value.childNodes[0],0));
continue;
}
else if (tmpNode.index < tree.unit[tree.top-1].value.childNodes.length - 1) {
//未遍历孩子,将未遍历孩子压栈
tree.push(new Node(tree.unit[tree.top - 1].value.childNodes[tmpNode.index + 1], tmpNode.index + 1));
tmpNode = null;
continue;
}
}
else {
//没有孩子,弹出堆栈
tmpNode = tree.pop();
alert(tmpNode.value.tagName);
}
}
// var x = xmlDoc.documentElement.childNodes[0].childNodes[0].childNodes[0].childNodes[1];
// alert(x.childNodes.length + " " + x.childNodes[0].tagName);
}
function Node(x,i) {
this.value = x;
this.index = i;
}
function stack() {
if (this.top == undefined) {
//初始化堆栈的顶部指针和数据存放域
this.top = 0;
this.unit = new Array();
}
this.push = function (pushvalue) {
//定义压入堆栈的方法
this.unit[this.top] = pushvalue;
this.top += 1;
}
this.readAllElements = function () {
//定义读取所有数据的方法
if (this.top == 0) {
alert("当前栈空,无法读取数据");
return ("");
}
var count = 0;
var outStr = "";
for (count = 0; count < this.top; count++) {
outStr += this.unit[count] + ",";
}
return (outStr);
}
this.pop = function () {
//定义弹出堆栈的方法
if (this.top == 0) {
alert("当前栈空,无法弹出数据");
return ("");
}
var popTo = this.unit[this.top - 1];
this.top--;
return (popTo);
/* 从堆栈弹出数据,顶部指针减一,不过这里没有做到资源的释放,也
就是说数据仍然存在于this.unit的数组中,只不过无法访问罢了。目前
我也没想到好的办法解决。*/
}
}