由于经常接触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机器上跑都没问题的,其他的机器没有测试,应该不会有多大问题。
分享到:
相关推荐
Linksys WRT1200AC中文固件,亲测可以使用!
DD-WRT 简易使用教程 全部图片+文字 有中英文界面
WRT54G_中文说明书WRT54G_中文说明书
第三方固件DD-WRT使用教程 第三方固件DD-WRT使用教程
准备1根网线,将路由器通电,用网线一端接在电脑的网卡上(注:网卡的IP地址要保持自动分配),另一端接在路由的1-4LAN任意一口。在IE浏览器中输入192.168.1.1
Linksys WRT1900AC V2中文固件
路由器刷dd-wrt使用说明..路由器刷dd-wrt使用说明..路由器刷dd-wrt使用说明。
DD-WRT 最新发行版V24 设置宽带ADSL上网帐号路由拨号; 万能无线中继的实现; WDS无线桥接设置 AP模式 wireless无线设置
dd-wrt的详细配置和方法! 登陆路由器的用户名是root 密码admin (小写)
WRT3200ACM.zip
linksys Wrt54G V7 最新固件v7.00.8,包含中文语言包(不需要TFTP传送至路由器),请注意,这个固件是V7版的wrt54g适用,别的版本不建议刷,这个可说是终极固件了,直接在路由器的网页上传语言包及设置简体中文。...
WRT54G原厂中文固件,给所有刷机失败的机友,我也找了好久
LINKSYS WRT54G / WRT54GL 官方最新2009年中文固件 v4.30.13中文语言包
贝尔金7231-4p刷中文版DD-WRT稳定固件,fttp方式刷即可 2009年的版本
了解一下,主要介绍DD-WRT的主要功能,安装等图文教程
sike\\\思科思科WRT54G_WRT54GL.bin
DD-WRT Fantasia 1.1 Build 20120831 实现功能/特性: NAT性能优化 IPID修改 ARP防火墙 PPPoE服务器(可以和原版QoS或IP限速配合使用) PPPoE中继功能 autoap功能 花生壳支持 IP限速 简易QoS 刷机成功的机型: ...
DD-WRT设置说明DD-WRT设置说明
中文tftp 可以用于dd-wrt 刷新 我已经试过,不错哦
Linksys WRT1900AC 刷砖(DD-WRT)后的TTL线刷详解3.pdf