123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- /*
- ### jQuery XML to JSON Plugin v1.1 - 2008-07-01 ###
- * http://www.fyneworks.com/ - diego@fyneworks.com
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- ###
- Website: http://www.fyneworks.com/jquery/xml-to-json/
- *//*
- # INSPIRED BY: http://www.terracoder.com/
- AND: http://www.thomasfrank.se/xml_to_json.html
- AND: http://www.kawa.net/works/js/xml/objtree-e.html
- *//*
- This simple script converts XML (document of code) into a JSON object. It is the combination of 2
- 'xml to json' great parsers (see below) which allows for both 'simple' and 'extended' parsing modes.
- */
- // Avoid collisions
- ;if(window.jQuery) (function($){
-
- // Add function to jQuery namespace
- $.extend({
-
- // converts xml documents and xml text to json object
- xml2json: function(xml, extended) {
- if(!xml) return {}; // quick fail
-
- //### PARSER LIBRARY
- // Core function
- function parseXML(node, simple){
- if(!node) return null;
- var txt = '', obj = null, att = null;
- var nt = node.nodeType, nn = jsVar(node.localName || node.nodeName);
- var nv = node.text || node.nodeValue || '';
- /*DBG*/ //if(window.console) console.log(['x2j',nn,nt,nv.length+' bytes']);
- if(node.childNodes){
- if(node.childNodes.length>0){
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'CHILDREN',node.childNodes]);
- $.each(node.childNodes, function(n,cn){
- var cnt = cn.nodeType, cnn = jsVar(cn.localName || cn.nodeName);
- var cnv = cn.text || cn.nodeValue || '';
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>a',cnn,cnt,cnv]);
- if(cnt == 8){
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>b',cnn,'COMMENT (ignore)']);
- return; // ignore comment node
- }
- else if(cnt == 3 || cnt == 4 || !cnn){
- // ignore white-space in between tags
- if(cnv.match(/^\s+$/)){
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>c',cnn,'WHITE-SPACE (ignore)']);
- return;
- };
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>d',cnn,'TEXT']);
- txt += cnv.replace(/^\s+/,'').replace(/\s+$/,'');
- // make sure we ditch trailing spaces from markup
- }
- else{
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>e',cnn,'OBJECT']);
- obj = obj || {};
- if(obj[cnn]){
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>f',cnn,'ARRAY']);
-
- // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
- if(!obj[cnn].length) obj[cnn] = myArr(obj[cnn]);
- obj[cnn] = myArr(obj[cnn]);
-
- obj[cnn][ obj[cnn].length ] = parseXML(cn, true/* simple */);
- obj[cnn].length = obj[cnn].length;
- }
- else{
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'node>g',cnn,'dig deeper...']);
- obj[cnn] = parseXML(cn);
- };
- };
- });
- };//node.childNodes.length>0
- };//node.childNodes
- if(node.attributes){
- if(node.attributes.length>0){
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'ATTRIBUTES',node.attributes])
- att = {}; obj = obj || {};
- $.each(node.attributes, function(a,at){
- var atn = jsVar(at.name), atv = at.value;
- att[atn] = atv;
- if(obj[atn]){
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'attr>',atn,'ARRAY']);
-
- // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
- //if(!obj[atn].length) obj[atn] = myArr(obj[atn]);//[ obj[ atn ] ];
- obj[cnn] = myArr(obj[cnn]);
-
- obj[atn][ obj[atn].length ] = atv;
- obj[atn].length = obj[atn].length;
- }
- else{
- /*DBG*/ //if(window.console) console.log(['x2j',nn,'attr>',atn,'TEXT']);
- obj[atn] = atv;
- };
- });
- //obj['attributes'] = att;
- };//node.attributes.length>0
- };//node.attributes
- if(obj){
- obj = $.extend( (txt!='' ? new String(txt) : {}),/* {text:txt},*/ obj || {}/*, att || {}*/);
- txt = (obj.text) ? (typeof(obj.text)=='object' ? obj.text : [obj.text || '']).concat([txt]) : txt;
- if(txt) obj.text = txt;
- txt = '';
- };
- var out = obj || txt;
- //console.log([extended, simple, out]);
- if(extended){
- if(txt) out = {};//new String(out);
- txt = out.text || txt || '';
- if(txt) out.text = txt;
- if(!simple) out = myArr(out);
- };
- return out;
- };// parseXML
- // Core Function End
- // Utility functions
- var jsVar = function(s){ return String(s || '').replace(/-/g,"_"); };
-
- // NEW isNum function: 01/09/2010
- // Thanks to Emile Grau, GigaTecnologies S.L., www.gigatransfer.com, www.mygigamail.com
- function isNum(s){
- // based on utility function isNum from xml2json plugin (http://www.fyneworks.com/ - diego@fyneworks.com)
- // few bugs corrected from original function :
- // - syntax error : regexp.test(string) instead of string.test(reg)
- // - regexp modified to accept comma as decimal mark (latin syntax : 25,24 )
- // - regexp modified to reject if no number before decimal mark : ".7" is not accepted
- // - string is "trimmed", allowing to accept space at the beginning and end of string
- var regexp=/^((-)?([0-9]+)(([\.\,]{0,1})([0-9]+))?$)/
- return (typeof s == "number") || regexp.test(String((s && typeof s == "string") ? jQuery.trim(s) : ''));
- };
- // OLD isNum function: (for reference only)
- //var isNum = function(s){ return (typeof s == "number") || String((s && typeof s == "string") ? s : '').test(/^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/); };
-
- var myArr = function(o){
-
- // http://forum.jquery.com/topic/jquery-jquery-xml2json-problems-when-siblings-of-the-same-tagname-only-have-a-textnode-as-a-child
- //if(!o.length) o = [ o ]; o.length=o.length;
- if(!$.isArray(o)) o = [ o ]; o.length=o.length;
-
- // here is where you can attach additional functionality, such as searching and sorting...
- return o;
- };
- // Utility functions End
- //### PARSER LIBRARY END
-
- // Convert plain text to xml
- if(typeof xml=='string') xml = $.text2xml(xml);
-
- // Quick fail if not xml (or if this is a node)
- if(!xml.nodeType) return;
- if(xml.nodeType == 3 || xml.nodeType == 4) return xml.nodeValue;
-
- // Find xml root node
- var root = (xml.nodeType == 9) ? xml.documentElement : xml;
-
- // Convert xml to json
- var out = parseXML(root, true /* simple */);
-
- // Clean-up memory
- xml = null; root = null;
-
- // Send output
- return out;
- },
-
- // Convert text to XML DOM
- text2xml: function(str) {
- // NOTE: I'd like to use jQuery for this, but jQuery makes all tags uppercase
- //return $(xml)[0];
- var out;
- try{
- var xml = ($.browser.msie)?new ActiveXObject("Microsoft.XMLDOM"):new DOMParser();
- xml.async = false;
- }catch(e){ throw new Error("XML Parser could not be instantiated") };
- try{
- if($.browser.msie) out = (xml.loadXML(str))?xml:false;
- else out = xml.parseFromString(str, "text/xml");
- }catch(e){ throw new Error("Error parsing XML string") };
- return out;
- }
-
- }); // extend $
- })(jQuery);
|