一種基于javascript的xml數(shù)據(jù)轉(zhuǎn)為json數(shù)據(jù)的方法
【專利摘要】本發(fā)明公開一種基于javascript的xml數(shù)據(jù)轉(zhuǎn)為json數(shù)據(jù)的方法,屬于數(shù)據(jù)格式轉(zhuǎn)換技術領域;本發(fā)明方法利用javascript中的操作,通過遞歸調(diào)用方法對xml對象數(shù)據(jù)進行解析,然后將原數(shù)據(jù)重新賦值為json對象數(shù)據(jù),提供給需要數(shù)據(jù)的模塊,從而達到在數(shù)據(jù)格式更改的目的。該方法操作簡單,解決了數(shù)據(jù)解析中的對象數(shù)據(jù)格式問題。適用于不同版本的瀏覽器,尤其適用于JavaScript開發(fā)的Web領域。
【專利說明】
一種基于javascr i pt的xm I數(shù)據(jù)轉(zhuǎn)為json數(shù)據(jù)的方法
技術領域
[0001]本發(fā)明公開一種基于javascript的xml數(shù)據(jù)轉(zhuǎn)為json數(shù)據(jù)的方法,屬于數(shù)據(jù)格式轉(zhuǎn)換技術領域。
【背景技術】
[0002]目前在頁面數(shù)據(jù)傳輸中有兩種主要的數(shù)據(jù)傳輸方式xml方式和json方式,json相較于xml,數(shù)據(jù)的體積小,傳遞的速度更快,與JavaScript的交互更加方便,更容易解析處理。但是由于j son興起時間較晚,在一些舊的系統(tǒng)中后臺數(shù)據(jù)格式一直在用xml格式,而用原來的后臺系統(tǒng)數(shù)據(jù)做新功能開發(fā)時,如果在后端全部把xml數(shù)據(jù)轉(zhuǎn)換為json數(shù)據(jù)則工作量大,并且十分繁瑣。當前雖然有一些對數(shù)據(jù)結構操作的方法,但是對xml節(jié)點屬性不能解析,或者解析的不合理。解析后對之間的xml結構造成破壞。不能直接應用于插件中。
[0003]而本發(fā)明提供了一種基于ja V a s c r i P t的X m I數(shù)據(jù)轉(zhuǎn)為j s ο η數(shù)據(jù)的方法,利用javascript中對操作,通過遞歸調(diào)用方法對xml對象數(shù)據(jù)進行解析,然后將原數(shù)據(jù)重新賦值為json對象數(shù)據(jù),提供給需要數(shù)據(jù)的模塊,從而達到在數(shù)據(jù)格式更改的目的。該方法操作簡單,解決了數(shù)據(jù)解析中的對象數(shù)據(jù)格式問題。適用于不同版本的瀏覽器,尤其適用于JavaScript開發(fā)的Web領域。
【發(fā)明內(nèi)容】
[0004]本發(fā)明針對現(xiàn)有技術中的問題,提供一種基于javascript的xml數(shù)據(jù)轉(zhuǎn)為json數(shù)據(jù)的方法,在web開發(fā)中可以很好的對xml屬性值進行處理,將xml數(shù)據(jù)對象轉(zhuǎn)為json數(shù)據(jù)對象。
[0005]本發(fā)明提出的具體方案是:
一種基于javascript的xml數(shù)據(jù)轉(zhuǎn)為json數(shù)據(jù)的方法:
對輸入的xml數(shù)據(jù)解析成xml對象數(shù)據(jù),
建立數(shù)據(jù)解析事件,傳入新建對象及xml對象數(shù)據(jù),
根據(jù)傳入的新建對象及xml對象數(shù)據(jù)判斷根節(jié)點是否含有屬性值,對屬性值進行處理,以子節(jié)點的形式存入新建對象中,
獲取根節(jié)點值,判斷是否為空,將節(jié)點值存入數(shù)據(jù)節(jié)點,獲得根節(jié)點的子節(jié)點,判斷子節(jié)點的個數(shù),根據(jù)結果將數(shù)據(jù)存入新建對象,
解析之后的數(shù)據(jù)以json對象形式返回。
[0006]判斷子節(jié)點的個數(shù),循環(huán)判斷子節(jié)點是否含有下一級節(jié)點,如果為最后一級節(jié)點,將數(shù)據(jù)全部存入新建對象之中。
[0007]循環(huán)判斷是否含有下一級節(jié)點,若子節(jié)點含有下一級節(jié)點,創(chuàng)建數(shù)組或者對象數(shù)組,依次將數(shù)據(jù)存入新建對象中,直至循環(huán)完所有節(jié)點。
[0008]所述的方法,具體步驟為獲取需要展現(xiàn)的xml數(shù)據(jù); 判斷傳入數(shù)據(jù)是否為空,創(chuàng)建將要返回的對象;
創(chuàng)建轉(zhuǎn)換方法,處理節(jié)點屬性的值;
循環(huán)判斷處理有無下一級節(jié)點的數(shù)據(jù),將數(shù)據(jù)插入對象;
循環(huán)遞歸節(jié)點的數(shù)據(jù),將數(shù)據(jù)插入對象,返回最終對象。
[0009]本發(fā)明的有益之處是:
本發(fā)明方法:對輸入的xml數(shù)據(jù)解析成xml對象數(shù)據(jù),建立數(shù)據(jù)解析事件,傳入新建對象及xml對象數(shù)據(jù),根據(jù)傳入的新建對象及xml對象數(shù)據(jù)判斷根節(jié)點是否含有屬性值,對屬性值進行處理,以子節(jié)點的形式存入新建對象中,獲取根節(jié)點值,判斷是否為空,將節(jié)點值存入數(shù)據(jù)節(jié)點,獲得根節(jié)點的子節(jié)點,判斷子節(jié)點的個數(shù),根據(jù)結果將數(shù)據(jù)存入對象,解析之后的數(shù)據(jù)以json對象形式返回;
利用javascript中的操作,通過遞歸調(diào)用方法對xml對象數(shù)據(jù)進行解析,然后將原數(shù)據(jù)重新賦值為json對象數(shù)據(jù),提供給需要數(shù)據(jù)的模塊,從而達到在數(shù)據(jù)格式更改的目的。該方法操作簡單,解決了數(shù)據(jù)解析中的對象數(shù)據(jù)格式問題。適用于不同版本的瀏覽器,尤其適用于JavaScript開發(fā)的Web領域。
【附圖說明】
[0010]圖1本發(fā)明方法步驟流程示意圖。
【具體實施方式】
[0011 ] —種基于javascript的xml數(shù)據(jù)轉(zhuǎn)為json數(shù)據(jù)的方法:
對輸入的xml數(shù)據(jù)解析成xml對象數(shù)據(jù),
建立數(shù)據(jù)解析事件,傳入新建對象及xml對象數(shù)據(jù),
根據(jù)傳入的新建對象及xml對象數(shù)據(jù)判斷根節(jié)點是否含有屬性值,對屬性值進行處理,以子節(jié)點的形式存入新建對象中,
獲取根節(jié)點值,判斷是否為空,將節(jié)點值存入數(shù)據(jù)節(jié)點,獲得根節(jié)點的子節(jié)點,判斷子節(jié)點的個數(shù),根據(jù)結果將數(shù)據(jù)存入新建對象,
解析之后的數(shù)據(jù)以json對象形式返回。
[0012]利用上述方法,結合附圖對本發(fā)明做進一步說明。
[0013]上述方法中,對獲取根節(jié)點值,判斷是否為空,將節(jié)點值存入數(shù)據(jù)節(jié)點,獲得根節(jié)點的子節(jié)點,判斷子節(jié)點的個數(shù),根據(jù)結果將數(shù)據(jù)存入新建對象:
其中判斷子節(jié)點的個數(shù),循環(huán)判斷子節(jié)點是否含有下一級節(jié)點,如果為最后一級節(jié)點,將數(shù)據(jù)全部存入新建對象之中;
若子節(jié)點含有下一級節(jié)點,創(chuàng)建數(shù)組或者對象數(shù)組,依次將數(shù)據(jù)存入新建對象中,直至循環(huán)完所有節(jié)點。
[0014]根據(jù)上述的方法,具體操作步驟如下:
通過Jquery的ajax方法獲取需要展現(xiàn)的xml數(shù)據(jù): funct1n testxmlAjax() {
$.ajax({
type: "post",//數(shù)據(jù)獲取的方式url: "js/nodeslOO0.xml",//訪問的地址
dataType: ’xml’,//接受的參數(shù)類型
processData: false,//參數(shù)不進行序列化處理
error: funct1n(data) {//調(diào)用錯誤執(zhí)行函數(shù)
alert(〃調(diào)用出錯啦〃);
},
success: funct1n(data) {//調(diào)用成功獲取xml類型數(shù)據(jù)
var result = tojson(data); //調(diào)用發(fā)明方法將xml類型數(shù)據(jù)轉(zhuǎn)化為json
}
});
}
判斷傳入數(shù)據(jù)是否為空,創(chuàng)建將要返回的對象:funct1n tojson(obj) {
if (obj == null) return null; //判斷是否為空,為空直接返回var retObj = new Object;//新建對象,存儲解析出來的數(shù)據(jù)
buildObjectNode(retObj , obj); //調(diào)用解析據(jù)方法,轉(zhuǎn)換數(shù)據(jù)格式return retObj ;//返回解析完成的數(shù)據(jù)
}
創(chuàng)建轉(zhuǎn)換方法,處理節(jié)點屬性的值:
//將獲取的xml數(shù)據(jù)和創(chuàng)建好的對象傳入funct1n buildObjectNode(cycleOBJ,eINode){
//獲取節(jié)點的屬性
var nodeAttr = eINode.attributes;if (nodeAttr != null) {
if (nodeAttr.length && cycleOBJ == null)cycleOBJ = new Object;
for (var i = 0; i < nodeAttr.length; i++) {
//將節(jié)點屬性存入對象中
cycleOBJ[nodeAttr[i].name] = nodeAttr[i].value;
}
}
循環(huán)判斷處理有無下一級節(jié)點的數(shù)據(jù),將數(shù)據(jù)插入對象:var nodeText = "text";
//判斷節(jié)點值是否為空if (elNode.text == null)nodeText = 〃textContent〃;
//定義子節(jié)點 var nodeChilds = elNode.childNodes; if (nodeChilds != null) {
if(nodeChilds.length && cycleOBJ == null) cycleOBJ = new Object;
//循環(huán)子節(jié)點數(shù)據(jù)
for (var i = 0; i < nodeChilds.length; i++) {if (nodeChilds[i].tagName != null) {
//處理下一級節(jié)點為空的數(shù)據(jù)
if (nodeChilds[i].chiIdNodes[0]! =nulIMnodeChiIds
[i].childNodes.length <= I && (nodeChilds[i].chiIdNodes[0].nodeType== 3| | nodeChilds[i].chiIdNodes[0].nodeType == 4))
{
//處理節(jié)點值為空的數(shù)據(jù)
if (cycleOBJ[nodeChilds[i].tagName] == null) {
cycleOBJ[nodeChilds[i].tagName] = nodeChilds[i][nodeText];
}else{
//將節(jié)點不為空的數(shù)據(jù)存入新建的對象中if(typeof(cycleOBJ[nodeChilds[i].tagName])=="object"&&cycleOBJ
[nodeChilds[i].tagName].length) {
cycleOBJ[nodeChilds[i].tagName][eyeIeOBJ[nodeChilds[i].tagName].length]=nodeChilds[i][nodeText];} else {
cycleOBJ[nodeChilds[i].tagName] = [cycleOBJ[nodeChilds[i].tagName]];
cycleOBJ[nodeChilds[i].tagName][I] = nodeChiIds[i][nodeText];
}
}
}
}
循環(huán)遞歸節(jié)點的數(shù)據(jù),將數(shù)據(jù)插入對象,返回最終對象:
/ /處理子節(jié)點節(jié)點數(shù)不唯一的節(jié)點 if (nodeChilds[i].childNodes.length) {
// tagName屬性為空新建對象遞歸處理數(shù)據(jù)
if (cycleOBJ[nodeChilds[i].tagName] == null) {cycleOBJ[nodeChilds[i].tagName] = new Object;
buildObjectNode(cycleOBJ[nodeChilds[i].tagName], nodeChilds[i]);
}else{
// tagName屬性個數(shù)唯一時,遞歸處理節(jié)點
if(cycleOBJ[nodeChilds[i].tagName].length){cycleOBJ[nodeChilds[i].tagName][eyeIeOBJ[nodeChiIds[i].tagName].length] = new Object;
//遞歸處理數(shù)據(jù)
buildObjectNode(cycleOBJ[nodeChilds[i].tagName][cycleOBJ[nodeChilds[i].tagName].length - 1],nodeChilds[i]);
}else{
// tagName屬性個數(shù)不唯一時,遞歸處理節(jié)點 cycleOBJ[nodeChilds[i].tagName] = [cycleOBJ [nodeChilds[i].tagName]];
eyeIeOBJ[nodeChiIds[i].tagName][I] = new Object;buildObjectNode(cycleOBJ[nodeChilds[i].tagName][I], nodeChilds[i]);
}
}
} else {
//節(jié)點子節(jié)點唯一,直接將數(shù)據(jù)存入對象
cycleOBJ[nodeChilds[i].tagName] = nodeChilds[i][nodeText];
}
本發(fā)明方法實現(xiàn)方便,對xml數(shù)據(jù)進行很好的處理,具有較好的易用性。本方法對節(jié)點屬性值進行了很好的處理保證了數(shù)據(jù)的結構,能夠解決xml轉(zhuǎn)json對象后由于結構變化導致不能直接應用對象數(shù)據(jù)的問題。
【主權項】
1.一種基于javascript的xml數(shù)據(jù)轉(zhuǎn)為json數(shù)據(jù)的方法,其特征是 對輸入的xml數(shù)據(jù)解析成xml對象數(shù)據(jù), 建立數(shù)據(jù)解析事件,傳入新建對象及xml對象數(shù)據(jù), 根據(jù)傳入的新建對象及xml對象數(shù)據(jù)判斷根節(jié)點是否含有屬性值,對屬性值進行處理,以子節(jié)點的形式存入新建對象中, 獲取根節(jié)點值,判斷是否為空,將節(jié)點值存入數(shù)據(jù)節(jié)點,獲得根節(jié)點的子節(jié)點,判斷子節(jié)點的個數(shù),根據(jù)結果將數(shù)據(jù)存入新建對象, 解析之后的數(shù)據(jù)以json對象形式返回。2.根據(jù)權利要求1所述的方法,其特征是判斷子節(jié)點的個數(shù),循環(huán)判斷子節(jié)點是否含有下一級節(jié)點,如果為最后一級節(jié)點,將數(shù)據(jù)全部存入新建對象之中。3.根據(jù)權利要求2所述的方法,其特征是循環(huán)判斷是否含有下一級節(jié)點,若子節(jié)點含有下一級節(jié)點,創(chuàng)建數(shù)組或者對象數(shù)組,依次將數(shù)據(jù)存入新建對象中,直至循環(huán)完所有節(jié)點。4.根據(jù)權利要求1所述的方法,其特征是具體步驟為 獲取需要展現(xiàn)的xml數(shù)據(jù); 判斷傳入數(shù)據(jù)是否為空,創(chuàng)建將要返回的對象; 創(chuàng)建轉(zhuǎn)換方法,處理節(jié)點屬性的值; 循環(huán)判斷處理有無下一級節(jié)點的數(shù)據(jù),將數(shù)據(jù)插入對象; 循環(huán)遞歸節(jié)點的數(shù)據(jù),將數(shù)據(jù)插入對象,返回最終對象。
【文檔編號】G06F17/30GK105868374SQ201610198153
【公開日】2016年8月17日
【申請日】2016年4月1日
【發(fā)明人】袁紹
【申請人】浪潮電子信息產(chǎn)業(yè)股份有限公司