`

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,谢谢你的资料!有时间指点下呀

相关推荐

    计算机视觉开发:OpenCV入门教程及应用

    内容概要:本文档详细介绍了OpenCV的基本概念及其在计算机视觉领域的应用,重点讲解了OpenCV在C++和Python环境下的安装方法,并提供了图像读取、显示、基本操作、视频处理以及面部检测的具体代码示例。此外,还涉及了一些图像处理技术的快速演示和进一步学习的路径建议。 适合人群:对计算机视觉感兴趣的新手开发者和技术爱好者。 使用场景及目标:本教程适用于希望入门计算机视觉和图像处理的新手,通过实际操作练习提升技术水平,掌握OpenCV的基本用法,并能够应用于实际项目,如OCR应用、图像分割与目标检测等。 阅读建议:建议读者按照文档提供的步骤进行实践,逐步完成每个代码示例,结合官方文档和其他资源深入理解各个函数的作用。对于初学者来说,可以通过多动手尝试,加深对OpenCV的理解。

    围绕着一系列的经典Python练习题 .zip

    围绕着一系列的经典Python练习题。Python练习一些按照回顾排列的Python练习题。欢迎提交你的答案或添加更多有趣的题目!从开始学Python以来,接触了精彩的练习题。下面十个练习题,是我做的和练习出来的题里比较有趣的,现在按照难度由低到高排列。欢迎到GitHub上提交你的答案。猜测数字经典的猜数字游戏,几乎是学编程时都会做的。功能描述随机选择三个以内的数字作为答案。用户输入一个数字,程序会提示大了或者小了,直到用户猜中。2.FizzBu​​zz另一道经典编程题。功能描述遍历并打印0到100,如果数字能被3整除,显示Fizz如果数字能被5整除,显示Buzz如果能同时被3和5整除,就显示FizzBu​​zz。结果应该类似0,1 ,2,嘶嘶声,4,嗡嗡声,6……14,嘶嘶声,16……3. 猜测数字的AI和猜数字一样,不过这次是设计一个能猜数字的人工智能功能描述用户输入一个单位以内的数字,AI需要最少的猜测次数,并显示出猜测的次数和数字。4.整点报时老式的挂钟会在整点报时,响铃的次数和时间是一致的。我们设计了一个在电脑上运行的报时

    毕设源码-python-django基于python技术的学生管理系统的设计与开发-期末大作业+说明文档.rar

    本项目是一个基于Python技术的学生管理系统,采用Django框架进行开发,旨在为计算机相关专业的学生提供一个实践性强、功能全面的管理系统,以帮助他们完成毕业设计或进行项目实战练习。 系统实现了对学生信息、课程信息、成绩、考勤等多方面的管理功能。学生信息管理包括学生基本信息的增删改查;课程信息管理允许管理员设置课程信息,包括课程名称、授课老师、学分等;成绩管理功能使学生和教师能够录入、查看和修改成绩;考勤管理则方便教师记录学生的出勤情况。 该项目采用B/S架构,前端使用HTML、CSS、JavaScript等技术,后端使用Python语言和Django框架,数据库采用MySQL。Django框架提供了强大的后台管理功能,使得系统管理更加便捷。 通过开发这个项目,学生不仅能提升自己的编程能力,还能学习到如何构建一个实际应用的系统,对于即将步入职场的学生来说,具有很高的实用价值。

    python入门-安装Python软件包.pdf

    python入门——安装Python软件包

    消息中间件源码学习(打注释学习).zip

    消息中间件源码学习(打注释学习)

    阿里消息中间件MetaQ学习Demo.zip

    阿里消息中间件MetaQ学习Demo

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 抑制房地产泡沫问题研究 共69页.pdf

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 抑制房地产泡沫问题研究 共69页.pdf

    rbac组件(基于角色的权限控制).zip

    rbac组件(基于角色的权限控制)

    Discuz! X3.5 R20240520 增量补丁包下载 X3.5 2023-12-21 升级到 X3.5 2024-05-20 补丁包

    压缩包内,SC是简体补丁包,TC是繁体补丁包

    ssm框架Java项目源码-基于Java的在线日语培训平台的设计与实现+jsp毕设-大作业.zip

    本项目是一个基于Java的在线日语培训平台的设计与实现,采用SSM框架(Spring+SpringMVC+MyBatis)进行开发,旨在为计算机相关专业的学生提供一个实践和学习的平台,同时也为日语学习者提供一个在线学习的空间。项目中主要功能涵盖了用户管理、课程管理、学习资源上传下载、在线测试与反馈等多个方面。通过该平台,教师能够轻松管理课程内容和学生信息,学生则可以随时随地访问学习资源,参与在线课程和测试,从而提高学习效率和兴趣。 在开发此项目的过程中,我们重点关注了系统的可维护性和可扩展性,确保代码结构清晰,便于后续的功能迭代和优化。此外,通过使用SSM框架,实现了前后端的分离,提高了开发效率和系统的响应速度。该项目不仅能够满足毕设的需求,还能作为Java学习者提升编程能力和实践经验的实用工具。

    机器xuex(大模型):语言模型在生成问题答案时的真实性数据集

    TruthfulQA是一个专门设计的基准测试数据集,用于衡量。这个数据集包含了817个问题,覆盖了38个不同的类别,如健康、法律、金融和政治等。这些问题被精心设计,以至于某些人可能会因为错误的信念或误解而给出错误的答案。因此,要在这个数据集上表现良好,语言模型必须避免生成从模仿人类文本中学到的错误答案。 TruthfulQA的数据集结构包括两种配置:generation和multiple_choice。在generation配置中,每个问题都包含了类型、类别、问题、最佳答案、正确答案列表、错误答案列表和来源。而在multiple_choice配置中,每个问题都提供了四个选项,模型需要从中选择正确的答案。 这个数据集的目的是为了测试语言模型在真实性方面的弱点,而不是测试模型在有用任务上的表现。研究发现,最大的模型通常是最不真实的,这与其他NLP任务不同,在其他任务中,模型的性能随着模型大小的增加而提高。TruthfulQA的数据集提供了一个重要的工具,用于评估和改进语言模型在生成真实和可靠信息方面的能力。

    多彩吉安红色旅游网站-JAVA-基于springBoot多彩吉安红色旅游网站的设计与实现

    多彩吉安红色旅游网站-JAVA-基于springBoot多彩吉安红色旅游网站的设计与实现

    基于servlet+jsp+mysql实现的影视管理系统课程设计

    【作品名称】:基于servlet+jsp+mysql实现的影视管理系统【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 Java Web课程设计,基于servlet+jsp+ajax+mysql做的影视管理系统 运行环境: Tomcat 9.0 JDK 1.8 MySQL 8.0 后台管理账号密码均为:root,项目依赖:lib 目录 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    渗透测试人员的 Python 工具.zip

    渗透测试人员的 Python 工具渗透测试人员的 Python 工具如果你参与漏洞研究、逆向工程或渗透测试,我建议尝试 Python编程语言。它有一套丰富的有用库和程序。本页列出了其中一些。列出的大多数工具都是用 Python 编写的,其他工具只是现有 C 库的 Python 绑定,即它们使这些库可轻松地在 Python 程序中使用。一些更激进的工具(渗透测试框架、蓝牙粉碎器、Web 应用程序漏洞扫描器、战争拨号器等)被排除在外,因为这些工具在德国的法律地位仍然不太明确——即使在最高法院作出裁决之后也是如此。这个列表显然是为了帮助白帽黑客,目前我更愿意谨慎行事。网络Scapy发送、嗅探、剖析和伪造网络数据包。可交互使用或作为库使用pypcap、 Pcapy和 pylibpcaplibpcap 的几种不同的 Python 绑定libdnet低级网络例程,包括接口查找和以太网帧传输dpkt快速、简单的数据包创建/解析,包含基本 TCP/IP 协议的定义Impacket制作和解码网络数据包。包括对 NMB 和 SMB 等高级协议的支持pynidslibnids

    quark(夸克)正版下载

    quark(夸克)正版下载

    ssm框架Java项目源码-企业员工岗前培训管理系统+vue毕设-大作业.zip

    ssm框架Java项目源码-企业员工岗前培训管理系统+vue毕设-大作业.zip是一个专为计算机相关专业学生和Java学习者设计的项目资源。该项目以企业员工岗前培训管理为背景,采用经典的SSM(Spring+SpringMVC+MyBatis)框架进行后端开发,确保系统的稳定性和可扩展性。同时,前端采用Vue.js框架,实现了前后端分离,提升了用户体验和开发效率。 该项目的主要功能包括员工信息管理、培训课程管理、培训进度跟踪、考试成绩记录与统计等。通过这些功能,系统能够帮助企业高效地管理员工的岗前培训过程,确保培训质量,提升员工技能水平。 此外,该项目不仅适合作为计算机专业学生的毕业设计题目,也适合Java学习者进行项目实战练习,通过实际操作,加深对SSM框架和Vue.js的理解,提升编程能力和解决问题的能力。

    汇聚【Python应用】【Python实训】【Python技术分享】等等.zip

    你是 Pythonista汇聚【从零单排】【实战项目】【数据科学】【自然语言处理】【计算机】【面试题系列】【大航海】【Python应用】【错题集】【技术沙龙】【内推渠道】 】等等【人人都是Pythonista】由公众号【Python专栏】推出,请认准唯一标识请仔细阅读本文档,尤其是使用说明。目录说明计算机视觉计算机视觉DataScience数据科学作业所有的作业都提交在这个目录下,每个人创建属于自己的独立目录HR内推渠道Interview_Questions: 面试题集KnowledgeShare干货分享LearnFromZero从零单排NLP自然语言处理、自然语言处理OnePiece大航海PracticeProject实战项目PythonExercisePython练习、应用资源资源目录TechSalon技术沙龙WeeklyReport每周新鲜事、分享好项目、好资源使用说明命名规范文件夹命名规范必须为英文全部小写单词之间用下划线分割,例如nagios_check_tomcat第一个单词代表项目涉及应用,若有多个采用简写,最多2

    基于java的学生社团管理系统设计与实现.docx

    基于java的学生社团管理系统设计与实现.docx

    学习微服务框架SpringCloud的一些示例代码.zip

    学习微服务框架SpringCloud的一些示例代码

    基于java的数字家庭网站设计与实现.docx

    基于java的数字家庭网站设计与实现.docx

Global site tag (gtag.js) - Google Analytics