• 关于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

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

  • 相关阅读:
    COBBLER无人值守安装
    消息头 Content-Type引发的问题:Jmeter请求中postdata不是期望的,响应数据请求参数为null;已经请求没问题,可变量还是为空
    python爬虫-'gbk' codec can't encode character 'xa0' in position 134: illegal multibyte sequence
    正则表达式30分钟入门教程-链接
    linux常见命令学习汇总3-控制语句
    postman循环操作及响应判断-支持文本多变量输入
    linux常见命令学习汇总2-运算符
    linux常见命令学习汇总1
    Jmeter连接数据库方法与问题:Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
    mysql学习笔记-ifnull()函数与nullif()函数
  • 原文地址:https://www.cnblogs.com/Sandheart/p/1395027.html
Copyright © 2020-2023  润新知