下面是我写的一个根据路径从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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

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