java 传xml js_JavaScript实现XML与JSON互转代码(转载)

下面来分享一个关于JavaScript实现XML与JSON互转例子,这里面介绍了国外的三款xml转json的例子,希望这些例子能给你带来帮助。

最近在开发在线XML编辑器,打算使用JSON做为中间格式。因为JSON相对于XML,有着容易阅读、解析速度快、占用空间小等优点,更易于在WEB上传递数据。但在实际使用中还是发现了一些易于忽略的细节,对于需要严格保证XML原始结构的情况,在转换成JSON时需要一些注意。

XML转换成JSON的格式大概如下:

//XML形式

文章标题

章节标题

章节段落

//JSON表现形式

{"article": {"header": {"#text": "文章标题","@id": "h1"},"section": {"@id": "s1","header": "章节标题","p": "章节段落"}

}

}

用Js将XML转换成JSON的脚本,在网上找了一些现成的脚本,但大都只满足比较简单的情况,都不可以完成保证原始结构的互转。下面是从网上找到的一些脚本或者文章:

x2js不会将下面的XML正确还原。

//XML形式

章节

而第2个脚本jsonxml,在上面这种“文本混合标签”的情况下,没有将标签提取出来,而是转换成了下面这种格式。

{"p":"章节"}}

之后我做了些改动,将它解析成如下格式后,满足了“文本混合标签”可正确还原的情况。

{"p":[{"strong":"章节"},"段",{"em":"落"}]}

另外,形如下面的代码,使用上文提到的脚本进行转换,也会导致无法正确还原的情况。

第一节

标题

第二节

同样,在一个标签内,它的子标签出现了大于一次,如果需要记录数据的路径,应该使用数组来保存这个结构。正确的代码应该是:

{"article": [ {"section": {"#text": "第一节","@id": "s1"},

}, {"header": {"#text": "标题","@id": "h1"}

}, {"section": {"#text": "第一节","@id": "s2"}

}

]

}

jkl.parsexml

SAMPLE XML SOURCE: XML<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

10036

NY

New York

Broadway

SAMPLE SCRIPT:

var url = "zip-e.xml";var xml = newJKL.ParseXML( url );var data =xml.parse();

document.write( data["items"]["item"]["us_state"] );

document.write( data.items.item.us_state );//-->

OUTPUT JSON:

{

items: {

item: {

zip_cd:"1000001"us_state:"NY",

us_city:"New York",

us_dist:"Broadway",

}

}

};

jsonxml

//Changes XML to JSON

function xmlToJson(xml) {//Create the return object

var obj ={};if (xml.nodeType == 1) { //element//do attributes

if (xml.attributes.length > 0) {

obj["@attributes"] ={};for (var j = 0; j < xml.attributes.length; j++) {var attribute =xml.attributes.item(j);

obj["@attributes"][attribute.nodeName] =attribute.nodeValue;

}

}

}else if (xml.nodeType == 3) { //text

obj =xml.nodeValue;

}//do children

if(xml.hasChildNodes()) {for(var i = 0; i < xml.childNodes.length; i++) {var item =xml.childNodes.item(i);var nodeName =item.nodeName;if (typeof(obj[nodeName]) == "undefined") {

obj[nodeName]=xmlToJson(item);

}else{if (typeof(obj[nodeName].push) == "undefined") {var old =obj[nodeName];

obj[nodeName]=[];

obj[nodeName].push(old);

}

obj[nodeName].push(xmlToJson(item));

}

}

}returnobj;

};

The major change I needed to implement wasusing attributes.item(j) instead of the attributes[j] that most of the scripts I found used. With thisfunction, XML that looks like:

...becomes workable a JavaScriptobjectwith the following structure:

{"@attributes": {

AID:"=",

HOME:0,

URL:"davidwalsh.name/",

VER:"0.9",

},

SD=[

{"@attributes": {

FLAGS:"",

HOST:"davidwalsh.name",

TITLE: A

},

LINKSIN: {"@attributes": {

NUM:1102}

},

SPEED: {"@attributes": {

PCT:51,

TEXT:1421}

},

TITLE: {"@attributes": {

TEXT:"David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else",

}

},

},

{

POPULARITY: {"@attributes": {

TEXT:7131,

URL:"davidwalsh.name/"}

},

RANK: {"@attributes": {

DELTA:"-1648"}

},

REACH: {"@attributes": {

RANK= 5952}

}

}

]

}

说了半天下面整理了一个例子

function xmlToJson(xml) {//Create the return object

var obj ={};if (xml.nodeType == 1) { //element//do attributes

if (xml.attributes.length > 0) {

obj["@attributes"] ={};for (var j = 0; j < xml.attributes.length; j++) {var attribute =xml.attributes.item(j);

obj["@attributes"][attribute.nodeName] =attribute.nodeValue;

}

}

}else if (xml.nodeType == 3) { //text

obj =xml.nodeValue;

}//do children

if(xml.hasChildNodes()) {for (var i = 0; i < xml.childNodes.length; i++) {var item =xml.childNodes.item(i);var nodeName =item.nodeName;if (typeof (obj[nodeName]) == "undefined") {

obj[nodeName]=xmlToJson(item);

}else{if (typeof (obj[nodeName].length) == "undefined") {var old =obj[nodeName];

obj[nodeName]=[];

obj[nodeName].push(old);

}

obj[nodeName].push(xmlToJson(item));

}

}

}returnobj;

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值