使用js对json数据和xml数据的转化
function xml2json(xml, // element or document DOM node
tab) // tab or indent string for pretty output formatting
// omit or use empty string "" to supress.
// returns JSON string
function json2xml(obj, // javascript object
tab) // tab or indent string for pretty output formatting
// omit or use empty string "" to supress.
// returns XML string
- <pre name="code" class="javascript">/* This work is licensed under Creative Commons GNU LGPL License.
- License: http://creativecommons.org/licenses/LGPL/2.1/
- Version: 0.9
- Author: Stefan Goessner/2006
- Web: http://goessner.net/
- */
- function json2xml(o, tab) {
- var toXml = function(v, name, ind) {
- var xml = "";
- if (v instanceof Array) {
- for (var i=0, n=v.length; i<n; i++)
- xml += ind + toXml(v[i], name, ind+"\t") + "\n";
- }
- else if (typeof(v) == "object") {
- var hasChild = false;
- xml += ind + "<" + name;
- for (var m in v) {
- if (m.charAt(0) == "@")
- xml += " " + m.substr(1) + "=\"" + v[m].toString() + "\"";
- else
- hasChild = true;
- }
- xml += hasChild ? ">" : "/>";
- if (hasChild) {
- for (var m in v) {
- if (m == "#text")
- xml += v[m];
- else if (m == "#cdata")
- xml += "<![CDATA[" + v[m] + "]]>";
- else if (m.charAt(0) != "@")
- xml += toXml(v[m], m, ind+"\t");
- }
- xml += (xml.charAt(xml.length-1)=="\n"?ind:"") + "</" + name + ">";
- }
- }
- else {
- xml += ind + "<" + name + ">" + v.toString() + "</" + name + ">";
- }
- return xml;
- }, xml="";
- for (var m in o)
- xml += toXml(o[m], m, "");
- return tab ? xml.replace(/\t/g, tab) : xml.replace(/\t|\n/g, "");
- }</pre>
- /* This work is licensed under Creative Commons GNU LGPL License.
- License: http://creativecommons.org/licenses/LGPL/2.1/
- Version: 0.9
- Author: Stefan Goessner/2006
- Web: http://goessner.net/
- */
- function xml2json(xml, tab) {
- var X = {
- toObj: function(xml) {
- var o = {};
- if (xml.nodeType==1) { // element node ..
- if (xml.attributes.length) // element with attributes ..
- for (var i=0; i<xml.attributes.length; i++)
- o["@"+xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue||"").toString();
- if (xml.firstChild) { // element has child nodes ..
- var textChild=0, cdataChild=0, hasElementChild=false;
- for (var n=xml.firstChild; n; n=n.nextSibling) {
- if (n.nodeType==1) hasElementChild = true;
- else if (n.nodeType==3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)) textChild++; // non-whitespace text
- else if (n.nodeType==4) cdataChild++; // cdata section node
- }
- if (hasElementChild) {
- if (textChild < 2 && cdataChild < 2) { // structured element with evtl. a single text or/and cdata node ..
- X.removeWhite(xml);
- for (var n=xml.firstChild; n; n=n.nextSibling) {
- if (n.nodeType == 3) // text node
- o["#text"] = X.escape(n.nodeValue);
- else if (n.nodeType == 4) // cdata node
- o["#cdata"] = X.escape(n.nodeValue);
- else if (o[n.nodeName]) { // multiple occurence of element ..
- if (o[n.nodeName] instanceof Array)
- o[n.nodeName][o[n.nodeName].length] = X.toObj(n);
- else
- o[n.nodeName] = [o[n.nodeName], X.toObj(n)];
- }
- else // first occurence of element..
- o[n.nodeName] = X.toObj(n);
- }
- }
- else { // mixed content
- if (!xml.attributes.length)
- o = X.escape(X.innerXml(xml));
- else
- o["#text"] = X.escape(X.innerXml(xml));
- }
- }
- else if (textChild) { // pure text
- if (!xml.attributes.length)
- o = X.escape(X.innerXml(xml));
- else
- o["#text"] = X.escape(X.innerXml(xml));
- }
- else if (cdataChild) { // cdata
- if (cdataChild > 1)
- o = X.escape(X.innerXml(xml));
- else
- for (var n=xml.firstChild; n; n=n.nextSibling)
- o["#cdata"] = X.escape(n.nodeValue);
- }
- }
- if (!xml.attributes.length && !xml.firstChild) o = null;
- }
- else if (xml.nodeType==9) { // document.node
- o = X.toObj(xml.documentElement);
- }
- else
- alert("unhandled node type: " + xml.nodeType);
- return o;
- },
- toJson: function(o, name, ind) {
- var json = name ? ("\""+name+"\"") : "";
- if (o instanceof Array) {
- for (var i=0,n=o.length; i<n; i++)
- o[i] = X.toJson(o[i], "", ind+"\t");
- json += (name?":[":"[") + (o.length > 1 ? ("\n"+ind+"\t"+o.join(",\n"+ind+"\t")+"\n"+ind) : o.join("")) + "]";
- }
- else if (o == null)
- json += (name&&":") + "null";
- else if (typeof(o) == "object") {
- var arr = [];
- for (var m in o)
- arr[arr.length] = X.toJson(o[m], m, ind+"\t");
- json += (name?":{":"{") + (arr.length > 1 ? ("\n"+ind+"\t"+arr.join(",\n"+ind+"\t")+"\n"+ind) : arr.join("")) + "}";
- }
- else if (typeof(o) == "string")
- json += (name&&":") + "\"" + o.toString() + "\"";
- else
- json += (name&&":") + o.toString();
- return json;
- },
- innerXml: function(node) {
- var s = ""
- if ("innerHTML" in node)
- s = node.innerHTML;
- else {
- var asXml = function(n) {
- var s = "";
- if (n.nodeType == 1) {
- s += "<" + n.nodeName;
- for (var i=0; i<n.attributes.length;i++)
- s += " " + n.attributes[i].nodeName + "=\"" + (n.attributes[i].nodeValue||"").toString() + "\"";
- if (n.firstChild) {
- s += ">";
- for (var c=n.firstChild; c; c=c.nextSibling)
- s += asXml(c);
- s += "</"+n.nodeName+">";
- }
- else
- s += "/>";
- }
- else if (n.nodeType == 3)
- s += n.nodeValue;
- else if (n.nodeType == 4)
- s += "<![CDATA[" + n.nodeValue + "]]>";
- return s;
- };
- for (var c=node.firstChild; c; c=c.nextSibling)
- s += asXml(c);
- }
- return s;
- },
- escape: function(txt) {
- return txt.replace(/[\\]/g, "\\\\")
- .replace(/[\"]/g, '\\"')
- .replace(/[\n]/g, '\\n')
- .replace(/[\r]/g, '\\r');
- },
- removeWhite: function(e) {
- e.normalize();
- for (var n = e.firstChild; n; ) {
- if (n.nodeType == 3) { // text node
- if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node
- var nxt = n.nextSibling;
- e.removeChild(n);
- n = nxt;
- }
- else
- n = n.nextSibling;
- }
- else if (n.nodeType == 1) { // element node
- X.removeWhite(n);
- n = n.nextSibling;
- }
- else // any other node
- n = n.nextSibling;
- }
- return e;
- }
- };
- if (xml.nodeType == 9) // document node
- xml = xml.documentElement;
- var json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, "\t");
- return "{\n" + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "\n}";
- }
以上内容均来自于:http://goessner.net/download/prj/jsonxml/
可以将json完美转化成xml,很好用,很强大 。
[代码][JavaScript]代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
// 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].length) == "undefined" ) { var old = obj[nodeName]; obj[nodeName] = []; obj[nodeName].push(old); } obj[nodeName].push(xmlToJson(item)); } } } return obj; }; |
2. [代码][XML]代码
1
2
3
4
5
6
7
8
9
10
11
12
|
< ALEXA VER = "0.9" URL = "davidwalsh.name/" HOME = "0" AID = "=" > < SD TITLE = "A" FLAGS = "" HOST = "davidwalsh.name" > < TITLE TEXT = "David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else" /> < LINKSIN NUM = "1102" /> < SPEED TEXT = "1421" PCT = "51" /> </ SD > < SD > < POPULARITY URL = "davidwalsh.name/" TEXT = "7131" /> < REACH RANK = "5952" /> < RANK DELTA = "-1648" /> </ SD > </ ALEXA > |
3. [代码]JSON结果 跳至 [1] [2] [3] [全屏预览]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
{ "@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 } } } ] } |