关于JavaScript解析XML的性能的问题(已解决)
下面是我写的一个根据路径从XML文档中取值的方法,在XML节点比较少时,性能还可以,但如果节点太多,性能就不行了,大家看看哪里还能再优化?
1/* 获取XML对象中某个节点的值,支持下标
2 例:GetNodeValue(xmlDoc, 'root/channel[1]/title[3]');
3
4 xmlObj:XML对象;
5 path:要获取值的节点路径,如:'root/channel[1]/title[3]',不加下标时自动选择第一个,找不到节点时返回空;
6*/
7function GetNodeValue(xmlObj, path)
8{
9 var tempNodes = xmlObj;
10 if (!tempNodes) return '';
11 var tns = path.split('/');
12 var reg = /.*(\[(\d+)\])/;
13 var isGet = false; //判断是否获取到了值
14 for (var i = 0, l = tns.length; i < l; i++)
15 {
16 //提出名字与下标值
17 var tmp_name = tns[i];
18 var tmp_sub = 0;
19 var tmp_array = tmp_name.match(reg);
20 if (tmp_array != null)
21 {
22 tmp_sub = tmp_array[2];
23 tmp_name = tmp_name.replace(tmp_array[1], '');
24 }
25 isGet = false;
26 try{
27 if (tempNodes) tempNodes = tempNodes.getElementsByTagName(tmp_name)[tmp_sub];
28 }
29 catch (e)
30 {
31 return '';
32 }
33 if (tempNodes) isGet = true;
34 }
35 if (isGet)
36 {
37 if (isIE)
38 return tempNodes.text;
39 else
40 return tempNodes.textContent
41 }
42 else
43 return '';
44}
45
46
2 例:GetNodeValue(xmlDoc, 'root/channel[1]/title[3]');
3
4 xmlObj:XML对象;
5 path:要获取值的节点路径,如:'root/channel[1]/title[3]',不加下标时自动选择第一个,找不到节点时返回空;
6*/
7function GetNodeValue(xmlObj, path)
8{
9 var tempNodes = xmlObj;
10 if (!tempNodes) return '';
11 var tns = path.split('/');
12 var reg = /.*(\[(\d+)\])/;
13 var isGet = false; //判断是否获取到了值
14 for (var i = 0, l = tns.length; i < l; i++)
15 {
16 //提出名字与下标值
17 var tmp_name = tns[i];
18 var tmp_sub = 0;
19 var tmp_array = tmp_name.match(reg);
20 if (tmp_array != null)
21 {
22 tmp_sub = tmp_array[2];
23 tmp_name = tmp_name.replace(tmp_array[1], '');
24 }
25 isGet = false;
26 try{
27 if (tempNodes) tempNodes = tempNodes.getElementsByTagName(tmp_name)[tmp_sub];
28 }
29 catch (e)
30 {
31 return '';
32 }
33 if (tempNodes) isGet = true;
34 }
35 if (isGet)
36 {
37 if (isIE)
38 return tempNodes.text;
39 else
40 return tempNodes.textContent
41 }
42 else
43 return '';
44}
45
46
性能提高85%的已经写出来了(此性能是经过测试的):
1/*
2作者:Sandheart E-Mail:sxd.www@gmail.com 日期:2009-02-20
3获取XML对象中某个节点的值,支持下标
4例:GetNodeValue(xmlDoc, 'root/channel[1]/title[3]');
5参数:
6xmlObj:XML对象;
7path:要获取值的节点路径,如:'root/channel[1]/title[3]',不加下标时自动选择第一个,找不到节点时返回空;
8*/
9function GetNodeValue(xmlObj, path)
10{
11 //debugger;
12 var tempNodes = xmlObj;
13 if (!tempNodes) return '';
14 var tns = path.split('/');
15 var reg = /.*(\[(\d+)\])/;
16 var isGet = false; //判断是否获取到了值
17 for (var i = 0, l = tns.length; i < l; i++)
18 {
19 //提出名字与下标值
20 var tmp_name = tns[i];
21 var tmp_sub = 0;
22 var tmp_array = tmp_name.match(reg);
23 if (tmp_array != null)
24 {
25 tmp_sub = tmp_array[2];
26 tmp_name = tmp_name.replace(tmp_array[1], '');
27 }
28 isGet = false;
29 try
30 {
31 tempNodes = tempNodes.selectNodes(tmp_name)[tmp_sub];
32 isGet = true;
33 }
34 catch (e)
35 {
36 return '';
37 }
38 }
39 if (isGet && tempNodes)
40 {
41 if (isIE)
42 return tempNodes.text;
43 else
44 return tempNodes.textContent
45 }
46 else
47 return '';
48}
49
2作者:Sandheart E-Mail:sxd.www@gmail.com 日期:2009-02-20
3获取XML对象中某个节点的值,支持下标
4例:GetNodeValue(xmlDoc, 'root/channel[1]/title[3]');
5参数:
6xmlObj:XML对象;
7path:要获取值的节点路径,如:'root/channel[1]/title[3]',不加下标时自动选择第一个,找不到节点时返回空;
8*/
9function GetNodeValue(xmlObj, path)
10{
11 //debugger;
12 var tempNodes = xmlObj;
13 if (!tempNodes) return '';
14 var tns = path.split('/');
15 var reg = /.*(\[(\d+)\])/;
16 var isGet = false; //判断是否获取到了值
17 for (var i = 0, l = tns.length; i < l; i++)
18 {
19 //提出名字与下标值
20 var tmp_name = tns[i];
21 var tmp_sub = 0;
22 var tmp_array = tmp_name.match(reg);
23 if (tmp_array != null)
24 {
25 tmp_sub = tmp_array[2];
26 tmp_name = tmp_name.replace(tmp_array[1], '');
27 }
28 isGet = false;
29 try
30 {
31 tempNodes = tempNodes.selectNodes(tmp_name)[tmp_sub];
32 isGet = true;
33 }
34 catch (e)
35 {
36 return '';
37 }
38 }
39 if (isGet && tempNodes)
40 {
41 if (isIE)
42 return tempNodes.text;
43 else
44 return tempNodes.textContent
45 }
46 else
47 return '';
48}
49
如要使用此方法,请保留注释信息,谢谢。