-4

I want to convert this string to xml format.

Before that, it seems that I need to put this 'string' in an 'Object' and convert it to 'JSON format'. (I think)

My string is

"oTest^A1^BB:a1bb,oTest^A2^BB:a1cc,oTest^A1^CC:a2bb,oTest^A2^CC:a2cc"

And JSON format is

{ 
 "oTest": {
    "A1": {
      "BB": "a1bb",
      "CC": "a1cc"
    },
    "A2": {
      "BB": "a2bb",
      "CC": "a2cc"
    }
  }
}

And Finally I want

<oTest>
<A1>
  <BB>a1bb</BB>
  <CC>a1cc</CC>
</A1>
<A2>
  <BB>a2bb</BB>
  <CC>a2cc</CC>
</A2>
</oTest>

this XML format string.

(Is it possible to convert to XML directly without converting to JSON?)

I tried to put my string into 'Object' and failed to get a duplicate value.

Please ECMAscript 5 version..

I tried this

   function fn_str2obj2Json(sStr)
    {
        var objChild1 = {};
        var objChild2 = {};
        var objRtn = {};

        var sStr = "oTest^A1^BB:a1bb,oTest^A2^BB:a1cc,oTest^A1^CC:a2bb,oTest^A2^CC:a2cc";

        var arrStr = sStr.split(',');
        for (var i = 0; i < arrStr.length; i++) {
            var arrSpe = arrStr[i].split('^');
            var sLineName = arrSpe[0];
            var sTankName = arrSpe[1];
            var sItemName = arrSpe[2].split(':')[0];
            var sValue = arrSpe[2].split(':')[1];


            objChild2["" + sItemName + ""] = sValue;
            objChild1["" + sTankName + ""] = objChild2;
            objRtn["" + sLineName + ""] = objChild1;
            //$.extend(objChild1, objChild2);

            //objChild1 = {};
            //objChild2 = {};
        }

        var sJsonVal = JSON.stringify(objRtn, null, 2);

        //var sXmlVal = x2js.json2xml_str($.parseJSON(sJsonVal));

        objRtn = {};
    }
EleGreen
  • 3
  • 2

1 Answers1

0
{
   var s = "oTest^A1^BB:a1bb,oTest^A2^BB:a1cc,oTest^A1^CC:a2bb,oTest^A2^CC:a2cc";

   var data = {};
   s.split(",").forEach(function (ele) {
      var key_val = ele.split(":");
      var key = key_val[0];
      var val = key_val[1];

      var sub_keys = key.split("^");
      var last_subkey = sub_keys.pop();
      var p = data;
      sub_keys.forEach(function (subkey) {
         if (!p[subkey])
            p[subkey] = {};

         p = p[subkey];
      });

      p[last_subkey] = val;
   });

   var root_ele_name = Object.keys(data)[0];

   // The rest of this program assumes this program is run in a browser.

   var doc = document.implementation.createDocument(null, root_ele_name);

   var creator = function (creator, doc, parent, p) { 
      if (typeof(p) === 'object') {
         for (ele_name in p) {
            var node = doc.createElement(ele_name);
            parent.appendChild(node);
            creator(creator, doc, node, p[ele_name]);
         }
      } else {
         var node = document.createTextNode(p);
         parent.appendChild(node);
      }
   };

   creator(creator, doc, doc.documentElement, data[root_ele_name]);

   var xml = new XMLSerializer().serializeToString(doc);
   alert(xml);
}
ikegami
  • 367,544
  • 15
  • 269
  • 518