123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /**
- * jQuery plugin to convert a given $.ajax response xml object to json.
- *
- * @example var json = $.xml2json(response);
- */
- (function() {
- // default options based on https://github.com/Leonidas-from-XIV/node-xml2js
- var defaultOptions = {
- attrkey: '$',
- charkey: '_',
- normalize: false,
- explicitArray: false
- };
- // extracted from jquery
- function parseXML(data) {
- var xml, tmp;
- if (!data || typeof data !== "string") {
- return null;
- }
- try {
- if (window.DOMParser) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString(data, "text/xml");
- } else { // IE
- xml = new ActiveXObject("Microsoft.XMLDOM");
- xml.async = "false";
- xml.loadXML(data);
- }
- } catch (e) {
- xml = undefined;
- }
- if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) {
- throw new Error("Invalid XML: " + data);
- }
- return xml;
- }
- function normalize(value, options){
- if (!!options.normalize){
- return (value || '').trim();
- }
- return value;
- }
- function xml2jsonImpl(xml, options) {
- var i, result = {}, attrs = {}, node, child, name;
- result[options.attrkey] = attrs;
- if (xml.attributes && xml.attributes.length > 0) {
- for (i = 0; i < xml.attributes.length; i++){
- var item = xml.attributes.item(i);
- attrs[item.nodeName] = item.value;
- }
- }
- // element content
- if (xml.childElementCount === 0) {
- result[options.charkey] = normalize(xml.textContent, options);
- }
- for (i = 0; i < xml.childNodes.length; i++) {
- node = xml.childNodes[i];
- if (node.nodeType === 1) {
- if (node.attributes.length === 0 && node.childElementCount === 0){
- child = normalize(node.textContent, options);
- } else {
- child = xml2jsonImpl(node, options);
- }
- name = node.nodeName;
- if (result.hasOwnProperty(name)) {
- // For repeating elements, cast/promote the node to array
- var val = result[name];
- if (!Array.isArray(val)) {
- val = [val];
- result[name] = val;
- }
- val.push(child);
- } else if(options.explicitArray === true) {
- result[name] = [child];
- } else {
- result[name] = child;
- }
- }
- }
- return result;
- }
- /**w
- * Converts an xml document or string to a JSON object.
- *
- * @param xml
- */
- function xml2json(xml, options) {
- var n;
- if (!xml) {
- return xml;
- }
- options = options || {};
- for(n in defaultOptions) {
- if(defaultOptions.hasOwnProperty(n) && options[n] === undefined) {
- options[n] = defaultOptions[n];
- }
- }
- if (typeof xml === 'string') {
- xml = parseXML(xml).documentElement;
- }
- var root = {};
-
- if (xml.attributes && xml.attributes.length === 0 && xml.childElementCount === 0){
- root[xml.nodeName] = normalize(xml.textContent, options);
- } else {
- root[xml.nodeName] = xml2jsonImpl(xml, options);
- }
- return root;
- }
- if (typeof jQuery !== 'undefined') {
- jQuery.extend({xml2json: xml2json});
- } else if (typeof module !== 'undefined') {
- module.exports = xml2json;
- } else if (typeof window !== 'undefined') {
- window.xml2json = xml2json;
- }
- })();
|