关于JavaScript解析XML的性能的问题(已解决)

本文介绍了一种优化后的XML文档值获取方法,通过使用selectNodes替代getElementsByTagName,性能提高了85%。该方法支持指定节点路径及下标获取值。

下面是我写的一个根据路径从XML文档中取值的方法,在XML节点比较少时,性能还可以,但如果节点太多,性能就不行了,大家看看哪里还能再优化?

 

 1ExpandedBlockStart.gifContractedBlock.gif/**//*  获取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)
 8ExpandedBlockStart.gifContractedBlock.gif{
 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++)
15ExpandedSubBlockStart.gifContractedSubBlock.gif    {
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)
21ExpandedSubBlockStart.gifContractedSubBlock.gif        {
22            tmp_sub = tmp_array[2];
23            tmp_name = tmp_name.replace(tmp_array[1], '');
24        }

25        isGet = false;
26ExpandedSubBlockStart.gifContractedSubBlock.gif        try{
27            if (tempNodes) tempNodes = tempNodes.getElementsByTagName(tmp_name)[tmp_sub];
28        }

29        catch (e)
30ExpandedSubBlockStart.gifContractedSubBlock.gif        {
31            return '';
32        }

33        if (tempNodes) isGet = true;
34    }

35    if (isGet)
36ExpandedSubBlockStart.gifContractedSubBlock.gif    {
37        if (isIE)
38            return tempNodes.text;
39        else
40            return tempNodes.textContent
41    }

42    else
43        return '';
44}

45
46

 

性能提高85%的已经写出来了(此性能是经过测试的):

 

 1ExpandedBlockStart.gifContractedBlock.gif/**//*  
 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)
10ExpandedBlockStart.gifContractedBlock.gif{
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++)
18ExpandedSubBlockStart.gifContractedSubBlock.gif    {
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)
24ExpandedSubBlockStart.gifContractedSubBlock.gif        {
25            tmp_sub = tmp_array[2];
26            tmp_name = tmp_name.replace(tmp_array[1], '');
27        }

28        isGet = false;
29        try
30ExpandedSubBlockStart.gifContractedSubBlock.gif        {
31            tempNodes = tempNodes.selectNodes(tmp_name)[tmp_sub];
32            isGet = true;
33        }

34        catch (e)
35ExpandedSubBlockStart.gifContractedSubBlock.gif        {
36            return '';
37        }

38    }

39    if (isGet && tempNodes)
40ExpandedSubBlockStart.gifContractedSubBlock.gif    {
41        if (isIE)
42            return tempNodes.text;
43        else
44            return tempNodes.textContent
45    }

46    else
47        return '';
48}

49

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值