`

WRT中使用JS自动将XML、JSON转换成为对象

阅读更多

由于经常接触WRT,所以写了个一个解析XML和JSON的代码,比较通用。

解析XML的是很,代码会根据相关的配置,将节点组合成对象,然后返回。

 

请看代码:

NetWorkUtils.js - 用于Ajax网络连接

 

 

/**
 * 抓取网络数据,并进行处理
 * @param url 数据的url
 * @param param 需要传递的参数
 * @param callback 处理数据的函数
 * @param exceptionCallBack 出现异常如何处理的函数
 * @param isXML 是否是xml格式的数据,true 或者是false
 * @return
 */
function ajaxFetch(url, param, callback,exceptionCallBack, isXML) {
	var req = new Ajax();
	req.onreadystatechange = function() {
		if (req.readyState == 4 && req.status == 200) {
			if (!isXML && req.responseText != null) {
				callback(req.responseText);
			} else if (isXML && req.responseXML != null) {
					callback(req.responseXML);
			} else {
				callback(null);
			}
		} else if (req.readyState == 4 && req.status != 200) {
			if(exceptionCallBack!=null&&exceptionCallBack!=undefined)
			exceptionCallBack();
		}
	}

	var fullURL = url;
	if (fullURL.indexOf("?") == -1) {
		fullURL += "?";
	} else {
		fullURL += "&";
	}
	fullURL += "timestamp=" + (new Date().getTime());
	fullURL += "&" + param;
	req.open("GET", fullURL, true);
	req.send(null);
	
}

 

 

 

ProcessData.js - 用于处理数据并且进行回调

 

 

/**
 * 构造方法
 * @param {Object} Url xml JSON地址
 * @param {Object} parentNode 父节点,比如要把<item><title>aaa</title></item>转成对象,此参数就是item
 * @param {Object} options
 * @param {Object} processDataFunction 數據對象轉換完成后需要調用的方法
 */
function ProcessData(Url, parentNode, options, processDataFunction){
    this.URL = xmlUrl;
    this.parentNode = parentNode;
    this.options = options;
    this.processDataFunction = processDataFunction;
    selfProcessData = this;
}

ProcessData.prototype = new Object();
ProcessData.prototype.URL;
ProcessData.prototype.options;
ProcessData.prototype.parentNode;
ProcessData.prototype.processDataFunction;
ProcessData.prototype.dataArray;


/**
 * 处理XML数据调用的方法
 * @param {Object} exceptionFunction 抓取数据时候发生异常需要做的事情,比如提示重新连接等等
 */
ProcessData.prototype.buildxml = function(exceptionFunction){
    ajaxFetch(selfProcessData.URL, null, selfProcessData.buildXMLCallBack, exceptionFunction, true);
}


/**
 * 处理JSON数据调用的方法
 * @param {Object} exceptionFunction 抓取数据时候发生异常需要做的事情,比如提示重新连接等等
 */
ProcessData.prototype.buildJSON = function(exceptionFunction){
    ajaxFetch(selfProcessData.URL, null, selfProcessData.buildJSONCallBack, exceptionFunction, false);
}

/**
 * 抓取JSON后回调方法
 * @param {string} JSON字符串
 */
ProcessData.prototype.buildJSONCallBack = function(data){

    if (data == null && data == undefined) {
        return null;
    }
	json = stringToJSON(data);
	selfProcessData.processDataFunction(json);
}


/**
 * 抓取xml后回调方法
 * @param {Object} data dom 文档
 */
ProcessData.prototype.buildXMLCallBack = function(data){
    if (data == null && data == undefined) {
        return null;
    }
    var items = data.documentElement.getElementsByTagName(selfProcessData.parentNode);
    if (items == null && items == undefined) {
        return null;
    }
    var dataLength = items.length;
    var array = [];
    for (var i = 0; i < dataLength; i++) {
        //Set property and data into object
        selfProcessData.data1 = new Data();
        var optionsLength = selfProcessData.options.length;
        
        for (var j = 0; j < optionsLength; j++) {
            var option = selfProcessData.options[j];
            //要从XML读取的节点名称
            var nodeName = option['nodeName'];
            
            //取得节点元素
            var da = items[i].getElementsByTagName(nodeName)[0];
            //通过options取得对应的成员变量名称
            var memberName = option['memberName'];
            
            var nodeValueOrAttribute = option['nodeValueOrAttribute'];
            var attributeName = option['attributeName'];
            if (da != null || da != undefined) {
                //判断是取节点的值还是其中的属性值
                if (nodeValueOrAttribute == 'attribute' &&
                (attributeName != undefined || attributeName != null)) {
                    selfProcessData.data1.putProperty(memberName, da.getAttribute(attributeName));
                }
                else {
                    if (da.firstChild == null || da.firstChild == undefined) {
                        selfProcessData.data1.putProperty(memberName, null);
                    }
                    else {
                        selfProcessData.data1.putProperty(memberName, da.firstChild.nodeValue);
                    }
                }
            }
            else {
                selfProcessData.data1.putProperty(memberName, null);
            }
        }
        array[i] = selfProcessData.data1;
    }
    selfProcessData.processDataFunction(array);
}
 

 

 

json2.js - 用于处理JSON数据

 

 

/**
 * 将JSON转换成为string对象
 */
jsonToString =  function(obj){
    	var THIS = this; 
        switch(typeof(obj)){
            case 'string':
                return '"' + obj.replace(/(["\\])/g, '\\$1') + '"';
            case 'array':
                return '[' + obj.map(THIS.jsonToString).join(',') + ']';
            case 'object':
                 if(obj instanceof Array){
                    var strArr = [];
                    var len = obj.length;
                    for(var i=0; i<len; i++){
                        strArr.push(THIS.jsonToString(obj[i]));
                    }
                    return '[' + strArr.join(',') + ']';
                }else if(obj==null){
                    return 'null';

                }else{
                    var string = [];
                    for (var property in obj) string.push(THIS.jsonToString(property) + ':' + THIS.jsonToString(obj[property]));
                    return '{' + string.join(',') + '}';
                }
            case 'number':
                return obj;
            case false:
                return obj;
        }
    }

/**
 * 将String转换成JSON对象
 */
stringToJSON = function(obj){
    	return eval('(' + obj + ')');
}
 

 

 

Data.js - XML解析完成节点对象模型

 

 

function Data() {
	var argLength =arguments.length;
}

/**
 * Data继承于Object
 */
Data.prototype = new Object();

/**
 * 为Data增加成员变量,此类将会增加一个变量
 * @param property 属性的名称
 * @param value 属性的值
 * 
 */
Data.prototype.putProperty = function(property, value) {
	var s = new String(value);
	eval("this." + property + "=s.toString();");
}

/**
 * 增加一个函数
 * @param functionName 函数的名称
 * @param functionValue 函数的执行体
 * 
 */
Data.prototype.putFunction = function(functionName, functionValue) {
	eval("this." + functionName + "=" + functionValue);
}
 

 

 

使用时候的代码 :

 

 

 
    var e = "http://mdev.cc/dev/rss.php?fid=3";
    
    var options1 = [{
        nodeName: 'guid',//节点名称
        memberName: 'isPermaLink',//数据放在对象中的成员变量名称
        nodeValueOrAttribute: 'attribute',//是取属性的值还是取元素的文本?attribute:取得属性值,nodeValue:取得节点值
        attributeName: 'isPermaLink'//取哪个属性?
    }, {
        nodeName: 'description',//节点名称
        memberName: 'description',
        nodeValueOrAttribute: 'nodeValue'
    }, {
        nodeName: 'guid',//节点名称
        memberName: 'guidValue',
        nodeValueOrAttribute: 'nodeValue'
    }];
    
    
    var options2 = [{
        nodeName: 'title',//节点名称
        memberName: 'title',//数据放在对象中的成员变量名称
        nodeValueOrAttribute: 'nodeValue',//attribute:取得属性值,nodeValue:取得节点值
    }, {
        nodeName: 'description',//节点名称
        memberName: 'description',
        nodeValueOrAttribute: 'nodeValue'
    }, {
        nodeName: 'link',//节点名称
        memberName: 'link',
        nodeValueOrAttribute: 'nodeValue'
    }, {
        nodeName: 'author',//节点名称
        memberName: 'author',
        nodeValueOrAttribute: 'nodeValue'
    }, {
        nodeName: 'category',//节点名称
        memberName: 'category',
        nodeValueOrAttribute: 'nodeValue'
    }];
    
    
    /*
     processData = new ProcessData(e, "item",options2 , function(data){
     //	alert(data.length);
     alert(data[0].title +"  "+data[0].category +"  "+data[0].description);
     
     });
     processData.buildxml(); //这里要传递一个异常处理函数,当网络有问题的时候会自动调用
     */
    /////JSON
    var sss = "http://json.com/brands.txt";
    
    
    
    processData = new ProcessData(sss, "item", options2, function(json){
            alert(json.brands[1].brand);
    });
    
    processData.buildJSON();//这里要传递一个异常处理函数,当网络有问题的时候会自动调用
 

 

 processData.buildxml();

 processData.buildJSON();

 

这两个函数表示开始解析XML 或者JSON,如果在WRT中最后传递异常处理函数,不然出现了网络异常,程序在手机上就

不会跑了,实例:

 

 processData.buildxml(function(){
alert("No network!");
});
 

这些代码在NOKIA N97 6710 E72机器上跑都没问题的,其他的机器没有测试,应该不会有多大问题。

 

 

分享到:
评论
1 楼 abin7230 2010-03-26  
我目前刚开始学弄WRT,谢谢你的资料!有时间指点下呀

相关推荐

    Linksys WRT1200AC中文固件 中文ROM

    Linksys WRT1200AC中文固件,亲测可以使用!

    DD-WRT 简易使用教程 全部图片+文字 有中英文界面

    通过查阅此文件,用户可以深入学习更多关于DD-WRT的高级特性,解决在使用过程中遇到的问题。 总之,DD-WRT为用户提供了丰富的定制选项和专业级的网络管理功能,无论是家庭还是小型企业,都可以通过掌握DD-WRT来提升...

    DD-WRT中文设置方法

    准备1根网线,将路由器通电,用网线一端接在电脑的网卡上(注:网卡的IP地址要保持自动分配),另一端接在路由的1-4LAN任意一口。在IE浏览器中输入192.168.1.1

    Linksys WRT1900AC V2中文固件 中文ROM

    Linksys WRT1900AC V2中文固件

    WRT54G_中文说明书

    WRT54G_中文说明书WRT54G_中文说明书

    DD-WRT中文教程

    这篇中文教程将带你深入理解如何利用DD-WRT V24最新发行版来提升你的网络设备性能。 首先,我们要进行的是“设置宽带ADSL上网帐号路由拨号”。在DD-WRT中,你可以通过以下步骤配置ADSL连接: 1. 登录到DD-WRT的Web...

    中文tftp 可以用于dd-wrt 刷新

    标题中的“中文tftp 可用于dd-wrt 刷新”涉及到两个主要的IT技术概念:TFTP(Trivial File Transfer Protocol)和DD-WRT。TFTP是一种轻量级的文件传输协议,通常用于网络设备配置或固件更新,而DD-WRT则是一个流行的...

    第三方固件DD-WRT使用教程

    第三方固件DD-WRT使用教程 第三方固件DD-WRT使用教程

    WRT3200ACM.zip

    标题"WRT3200ACM.zip"暗示了这是一个与Linksys WRT3200ACM路由器相关的软件更新或固件升级包。WRT3200ACM是一款高性能的无线路由器,以其开放源码的支持和强大的硬件配置受到DIY网络爱好者和高级用户的青睐。该...

    WRT54G原厂中文固件

    对于那些在尝试刷机过程中遇到困难的用户来说,"WRT54G原厂中文固件"无疑是一份宝贵的救星。这个固件不仅提供了官方的稳定版本,还特别加入了中文界面,使得操作更加友好,降低了使用门槛,尤其是对于中文环境下的...

    路由器刷dd-wrt使用说明.rar

    这篇使用说明将引导你完成路由器刷入DD-WRT的过程,让你能够充分利用这款强大的固件。 一、DD-WRT简介 DD-WRT是基于Linux的第三方路由器固件,其目标是提升普通家用路由器的功能性和稳定性。它提供了许多原厂固件不...

    Open WRT路由器开发说明

    Open WRT 是一个开源的操作系统,主要应用于路由器和嵌入式设备中。下面是 Open WRT 路由器开发说明的相关知识点: 一、 Open WRT 简介 Open WRT 是一个基于 Linux 的操作系统,专门设计用于路由器和嵌入式设备。...

    Linksys WRT1900AC 刷砖(DD-WRT)后的TTL线刷详解3.pdf

    根据给定文件的内容,我们将详细探讨Linksys WRT1900AC路由器刷写DD-WRT固件之后,如何使用TTL线进行重新刷写固件的过程。这个过程通常被称为“刷砖”,因为如果操作不当,可能会导致路由器无法启动,即变“砖”。...

    wrt54g TFTP中文版

    (e) 使用TFTP客户端将固件文件发送到路由器;(f) 路由器接收并安装新固件。 5. **192.168.1.1**:这是大多数Linksys路由器的默认IP地址,用于访问路由器的管理控制台。用户可以在此更改网络设置,查看连接状态,...

    LINKSYS WRT54G / WRT54GL 官方最新2009年中文固件 v4.30.13中文语言包

    通过以上解释,我们可以理解这个固件更新对于那些使用WRT54G或WRT54GL路由器的用户来说,是一个重要的资源,特别是对于那些需要中文界面的用户。然而,随着时间的推移,用户应该考虑升级到更现代的固件以确保最佳的...

    WRT54G2 V1 DD-WRT精简版固件

    描述中的“思科WR54G2 v1 DD-WRT精简版固件”进一步确认了这是为Cisco Linksys WRT54G2的第1个版本设计的DD-WRT固件。这通常意味着用户可以升级他们的路由器固件,从而获得更高级的网络管理功能、更强的信号强度、更...

    DD-WRT设置说明

    ### DD-WRT设置详解 #### 一、简介 DD-WRT是一种基于Linux的第三方固件,主要用于路由器等网络设备,可以极大地扩展路由器的功能并提供高级的网络管理选项。本文将详细介绍如何安装和配置DD-WRT固件,以及如何进行...

    WRt54G v7 7.0.08 中文语言包

    在升级过程中,用户需要关闭所有可能占用网络连接的程序,如IE浏览器,以确保TFTP传输过程不会受到干扰。 具体步骤大致如下: 1. 下载Wrt54Gv7_sc.bin文件,这是WRt54G v7 7.0.08 中文语言包的固件文件。 2. 在电脑...

    WRT54G v7 7.0.08英文固件和中文语言包

    4. 升级过程中不要断开电源或关闭路由器,等待固件安装完成,路由器可能会自动重启。 5. 重启后,检查新固件是否成功安装,确认路由器功能正常。 对于中文语言包的安装: 1. 使用SFTP客户端连接到路由器,如...

    DD-WRT中文配置

    dd-wrt的详细配置和方法! 登陆路由器的用户名是root 密码admin (小写)

Global site tag (gtag.js) - Google Analytics