zoukankan      html  css  js  c++  java
  • 关于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

    性能提高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

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

  • 相关阅读:
    数组常用函数
    数组游标操作
    PHP中 字符串 常用函数
    mysqli扩展库的预处理技术 mysqli stmt
    mysql的事务处理
    mysqli的增强功能
    mysql扩展库-1
    抽象类与接口
    iOS判断字符串是否包含表情字符
    iOS8 UITableView 分割条设置separator intent = 0 不起作用
  • 原文地址:https://www.cnblogs.com/Sandheart/p/1395027.html
Copyright © 2011-2022 走看看