关于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
*/
7
function 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
/* 获取XML对象中某个节点的值,支持下标2
例:GetNodeValue(xmlDoc, 'root/channel[1]/title[3]');3
4
xmlObj:XML对象;5
path:要获取值的节点路径,如:'root/channel[1]/title[3]',不加下标时自动选择第一个,找不到节点时返回空;6
*/7
function 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
else40
return tempNodes.textContent41
}42
else43
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
参数:
6
xmlObj:XML对象;
7
path:要获取值的节点路径,如:'root/channel[1]/title[3]',不加下标时自动选择第一个,找不到节点时返回空;
8
*/
9
function 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-203
获取XML对象中某个节点的值,支持下标4
例:GetNodeValue(xmlDoc, 'root/channel[1]/title[3]');5
参数: 6
xmlObj:XML对象;7
path:要获取值的节点路径,如:'root/channel[1]/title[3]',不加下标时自动选择第一个,找不到节点时返回空;8
*/9
function 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
try30
{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
else44
return tempNodes.textContent45
}46
else47
return '';48
}49

如要使用此方法,请保留注释信息,谢谢。


浙公网安备 33010602011771号