XML遍历问题
我写了一个遍历XML文件的一个小代码,现在我是想把遍历时的父子关系用ID号来保存到数组(不是数组也行),怎么办呢?
比如:
<?xml version="1.0" encoding="gbk"?>
<root>
<a/>
<b/>
<c>
<d/>
<e/>
</c>
<f/>
</root>
我要保存这样的:
id号 父id号
1 0 //这个是<root> 第一个不用管,默认为零,ID号是递增的
2 1 //这个是<a>
3 1 //这个是<b>
4 1 //这个是<c>
5 4 //这个是<d>
6 4 //这个是<e>
7 1 //这个是<f>
我遍历时是用的递规,可是这个ID把我搞得好晕啊。。。。。。
希望有人帮我解答给个小example,万分感谢!!!
其实我现在需要的是按层遍历。
问题点数:100、回复次数:15Top
1 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-11-30 16:38:37 得分 10
up
思考一下
Top
2 楼moodboy1982(老鹰)回复于 2005-11-30 16:41:39 得分 0
你上面的那种XML格式是什么意思?要实现什么功能?Top
3 楼dh20156(风之石)回复于 2005-11-30 16:45:40 得分 10
这个对你可能有帮助:
http://blog.csdn.net/dh20156/archive/2005/05/12/373830.aspxTop
4 楼qhgary(Gary)回复于 2005-11-30 17:47:14 得分 20
其实你的要求就是如何用数组来存储树的结构。
一般我们是用链表来做,但是也可以用数组来存储。实际上通过“父id号”
就能够知道每个节点有几个孩子。比如“父id号”=1的有4个,那么就说明
id=1的这个结点,也就是root节点一共有4个孩子。分别是2,3,4,7。也
就是对应的a,b,c,f。
这个数组填写起来也很容易,不过首先你要知道有多少个数据,用来分配这个
表格的大小,然后第一列总归是1,2,3,4,5,6,7,且1对应的父id应该是0,就是
root节点。然后看这个数的第一层为a,b,c,f,那么将2,3,4,7对应的父id填写
成为1,因为他们的父节点都是root。然后看第二层,...依此类推。
root(1)
a(2) b(3) c(4) f(7)
d(5) e(6)Top
5 楼czq9966(宁录)(毛主席领导咱闹革命……)回复于 2005-11-30 17:55:48 得分 0
UPTop
6 楼donghid(想得太多,快要疯掉了!神哪,让我静下来)回复于 2005-11-30 19:26:28 得分 0
你要怎么存,用一维数组来存?Top
7 楼rotApple(烂苹果)回复于 2005-12-01 14:30:23 得分 0
donghid(想得太多,快要疯掉了!神哪,让我静下来)
用二维
用对列
随便。
qhgary(Gary)
说的我有些糊涂,可以写一个小例子吗?
moodboy1982(虎落平川被犬欺)
这个XML只是用来表示一下的
我的意思就是把一个XML文件内的所有节的父子关系用数组存起来
其实我只是这样写!反正大家有什么好的方法都可以说嘛,不一定非要我这样用数组,什么存方便就用什么存!!谢谢大家了!Top
8 楼cunsh(村少)回复于 2005-12-01 15:15:17 得分 0
队列.Top
9 楼rotApple(烂苹果)回复于 2005-12-01 16:02:16 得分 0
dh20156(风之石)
看了你写的那个了,其实不是我要的,你写的只是普通的递归,可是这种是没用的
现在我要的是:
<root>
<item1/>
<item2>
<sub-itme1/>
<sub-item2>
<otheritem/>
</sub-item2>
</item2>
<item3>
<xxxxx/>
</item3>
</root>
你的遍历是root->item1->item2->sub-item1->sub-item2->otheritem->item3->xxxxxx这样遍历的,也就是说把一个节的深入完成后,再去遍历自己的兄弟节。
但问题是,现在我希望可以以层来遍历,也就按兄弟一层一层的遍历。Top
10 楼donghid(想得太多,快要疯掉了!神哪,让我静下来)回复于 2005-12-01 16:43:10 得分 0
你的id设置有问题吖
id号 父id号
1 0 //这个是<root> 第一个不用管,默认为零,ID号是递增的
2 1 //这个是<a>
3 1 //这个是<b>
4 1 //这个是<c>
5 4 //这个是<d>
6 4 //这个是<e>
7 1 //这个是<f>
你说你的id是递增的,分明就是按深度遍历呀,但你却要求按层遍历!这样的要求我无法写!
如果要按层遍历,那么就应该是这样的:
id号 父id号
1 0 //这个是<root> 第一个不用管,默认为零,ID号是递增的
2 1 //这个是<a>
3 1 //这个是<b>
4 1 //这个是<c>
6 4 //这个是<d>
7 4 //这个是<e>
5 1 //这个是<f>
你要先搞清楚结构Top
11 楼qhgary(Gary)回复于 2005-12-01 16:53:20 得分 0
我说的很清楚了,你光看是没有用的,你要拿一个笔跟着画一下。
id号 父id号
1 0 //这个是<root>
2 1 //这个是<a>
3 1 //这个是<b>
4 1 //这个是<c>
5 4 //这个是<d>
6 4 //这个是<e>
7 1 //这个是<f>
这不就是一个table麽,也就是一个数组啊。可以认为就是一个1维数组。
比如存放在int tree[8]这个数组里面,其中tree[0]不用,为了和编号一致。
剩下的tree[1]=0, tree[2]=1,... tree[7]=1,就表示出来上面那个表了。
tree[2],tree[3],tree[4],tree[7]的值都是1,证明这4个节点是tree[1]这个
节点的子节点。也就是说a,b,c,f是root的4个字节点。而tree[5],tree[6]的
值是4,说明tree[5], tree[6]是tree[4]的子节点,也就是说d,e是c的2个子节点。
另外tree[1]就是root,在最上面,这个树的图不是就画出来了麽?怎么还不清楚?Top
12 楼donghid(想得太多,快要疯掉了!神哪,让我静下来)回复于 2005-12-01 18:03:06 得分 60
按层遍历的代码:
<script>
var qNode=new Array;
var qCID=new Array;
var qPID=new Array;
var curID=1;
var xmldoc=new ActiveXObject('Microsoft.XMLDOM');
xmldoc.load('data.xml');
var oRoot=xmldoc.documentElement;
childs(oRoot,1,0);
function popQ(obj){ //出队
var cur=obj[0];
obj.reverse();
obj.length--;
obj.reverse();
return(cur);
}
function childs(Node,cID,parentID){
alert("当前结点:"+Node.nodeName+" ID="+cID+" 父ID="+parentID);
var childNodes=Node.childNodes;
if(childNodes.length!=0)
{
for(var i=0;i<childNodes.length;i++){
curID++;
qNode[qNode.length]=childNodes[i]; //入队
qCID[qCID.length]=curID; //自己的ID
qPID[qPID.length]=cID; //父ID
}
if(qNode.length!=0){
childs(popQ(qNode),popQ(qCID),popQ(qPID));
}
}
else
{
if(qNode.length!=0){
childs(popQ(qNode),popQ(qCID),popQ(qPID));
}
}
}
</script>Top
13 楼rotApple(烂苹果)回复于 2005-12-05 11:57:31 得分 0
问题OK!
特别谢谢: donghid(想得太多,快要疯掉了!神哪,让我静下来)
谢谢:
qhgary(Gary)
sankt(黄景天)
dh20156(风之石)Top
14 楼manyou(他山之石【养万头猪,行万里路】)回复于 2005-12-05 12:40:51 得分 0
偶三年前已解决了
http://blog.csdn.net/manyou/archive/2003/10/02/18729.aspxTop
15 楼rotApple(烂苹果)回复于 2005-12-05 12:57:39 得分 0
也谢谢大家!!Top




