Name

global.XMLHelper

Description

Helper methods for with XML. Has the following methods toObject converts an XML string (given in the constructor or as an argument) into a JavaScript object. toXML converts a JavaScript object (given as the argument) to an XML string. This is the inverse of toObject(), above. The JavaScript object produced or interpreted by the methods above is hierarchical, matching the hierarchy of the equivalent XML document. Property names have three flavors -- alphanumeric (like dog , bogus3 , etc.) correspond to an XML tag. The value of these properities is either an object or an array of objects, each of which contains other tags, attributes, or text. -- alphanumeric with leading @ (like @name , @id , etc.) correspond to attribute names (without the @ ). The value of these properties is the value of the attribute. -- text corresponds to single text field enclosed within a tag. The value of these properties is the value of the enclosed text. Example var xmlhelp = new XMLHelper( body ); var x = xmlhelp.toObject(); gs.log( tag is + x.tag);

Script

var XMLHelper = Class.create();
XMLHelper.prototype = {

  initialize : function(xml) {
      this.setXML(xml);
      this.trim = JSUtil.toBoolean(gs.getProperty("glide.xmlhelper.trim.enable", "false"));
  },

  setXML : function(xmlParam) {
       this.xml = xmlParam;

      // if xml is string, or it looks like a string (has trimLeft function and is object)
      // then we want to parse it as a string
      if (typeof xmlParam == 'string' || (typeof xmlParam == 'object' && xmlParam && xmlParam.trimLeft))
          this.xml = GlideXMLUtil.parse(xmlParam);
  },

  // Set whether or not to trim the xml values when going through the toObject method.
  setTrim : function(value) {
      this.trim = value;
  },

  // convert XML to Javascript Object... Use the format specified on
  // http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html
  toObject : function(xmlParam) {
      if (xmlParam)
          this.setXML(xmlParam);
      if (!this.xml)
          return;

      // borrowed and modified from: http://goessner.net/download/prj/jsonxml/xml2json.js
      var X = {
          toObj : function(xml) {
              var o = {};
              if (xml.getNodeType() == 1) { // element node ..
                  if (xml.attributes.length) // element with attributes ..
                      for ( var i = 0; i < xml.attributes.length; i++) {
                          var nName = xml.attributes.item(i).nodeName;
                          var nValue = '' + xml.attributes.item(i).nodeValue;
                          if (this.trim) nValue = JSUtil.nil(nValue)? "" : nValue.trim();
                          o["@" + nName] = (nValue || "");
                      }
                  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.getNodeType() == 1)
                              hasElementChild = true;
                          else if (n.getNodeType() == 3 && n.nodeValue.match(/[^ \f\n\r\t\v]/))
                              textChild++; // non-whitespace text
                          else if (n.getNodeType() == 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.getNodeType() == 3) // text node
                                      o["#text"] = X.escape(n.nodeValue);
                                  else if (n.getNodeType() == 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) ];
                                  }
                                  //PRB1475522: adding the condition to skip comment node in xml
                                  else if (n.getNodeType() != 8) {
                                      // 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 (!xml.attributes.length)
                              o = X.escape(xml.firstChild.nodeValue);
                          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.getNodeType() == 9) { // document.node
                  o = X.toObj(xml.documentElement);
              } else
                  gs.log("unhandled node type: " + xml.getNodeType());
              return o;
          },

          innerXml : function(node) {
              var s = "";
              if ("innerHTML" in node)
                  s = node.innerHTML;
              else {
                  var asXml = function(n) {
                      var s = "";
                      if (n.getNodeType() == 1) {
                          s += "<" + n.nodeName;
                          for ( var i = 0; i < n.attributes.length; i++)
                              s += " " + n.attributes.item(i).nodeName + "=\""
                                      + (n.attributes.item(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.getNodeType() == 3)
                          s += n.nodeValue;
                      else if (n.getNodeType() == 4)
                          s += "<![CDATA[" + n.nodeValue + "]]>";
                      return s;
                  };
                  for ( var c = node.firstChild; c; c = c.nextSibling)
                      s += asXml(c);
              }
              return s;
          },

          escape : function(txt) {
              var escapedTxt = '' + txt.replaceAll(/[\\]/g, "\\\\").replaceAll(/[\"]/g, '\\"').replaceAll(/[\n]/g, '\\n').replaceAll(/[\r]/g, '\\r');

              if (this.trim) 
                  return JSUtil.nil(escapedTxt)? "" : escapedTxt.trim();

              return escapedTxt;
          },

          removeWhite : function(e) {
              e.normalize();
              for ( var n = e.firstChild; n;) {
                  if (n.getNodeType() == 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.getNodeType() == 1) { // element node
                      X.removeWhite(n);
                      n = n.nextSibling;
                  } else
                      // any other node
                      n = n.nextSibling;
              }
              return e;
          },

          setTrim : function(value) {
              this.trim = value;
          }
      };

      var xml = this.xml;
      X.setTrim(this.trim);
      return X.toObj(X.removeWhite(xml));
  },

  // borrowed and modified from: http://goessner.net/download/prj/jsonxml/json2xml.js
  toXMLDoc : function(o, leaveBlanks) {
     return GlideXMLUtil.parse(this.toXMLStr(o, leaveBlanks));
  },

  toXMLStr : function(o, leaveBlanks) {
      var toXml = function(v, name, ind) {
  	   if (typeof(v) == "function")
  		  return "";
  	   
          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, "");
  	
  	if (leaveBlanks)
  		return xml;
  	
      return xml.replace(/\t|\n/g, "");
  },

  type : "XMLHelper"
}

Sys ID

0c370f970a0a0b5e00c99c151beb0f13

Offical Documentation

Official Docs: