如何在 suitescript 2.0 中将 xml 转换为 JSON

How to convert xml to JSON in suitescript 2.0

我有一个 XML 响应,我想将其转换为 JSON,我目前正在使用 XPath

var responseNode = xml.XPath.select({
                                    node : xmlDocument,
                                    xpath : '//SOAP-ENV:Envelope'
                                });

而且效率不是很高,因为要从一个 xml 标签中提取数据,我必须编写很多额外的代码。我尝试将外部库与 suitescript 一起使用,但它们没有用。有没有更好的方法将 XML 转换为 JSON

这是我的 NetSuite 环境中的示例函数。这不是我写的,但它目前正在运行。

//*********** PARSE XML INTO JSON ***********

function nsXMLToJSON(node){
  var obj=nsXMLToJSONDirty(node);  
  var cleanObj=cleanObject(obj,true);
  return cleanObj;

  //*********** HELPER FUNCTIONS ***********

  function nsXMLToJSONDirty(node){
    var obj={};
    if(!'nodeType' in node){
      return obj;
    }

    if(node.nodeType==1 || node.nodeType=='ELEMENT_NODE'){
      if(Object.keys(node.attributes).length > 0){
        obj["@attributes"]={};
        for(var j in node.attributes){
          var attribute=node.attributes[j];
          if(attribute){
            obj["@attributes"][attribute.name]=attribute.value;
          }
        }
      }
    }else if(node.nodeType==3 || node.nodeType=='TEXT_NODE'){
      obj=node.nodeValue;
    }

    if(node.hasChildNodes()){
      var childNodes=node.childNodes;
      for(var k in childNodes){
        var item=childNodes[k];
        var nodeName=item.nodeName;
        if(typeof (obj[nodeName])=="undefined"){
          obj[nodeName]=nsXMLToJSONDirty(item); //run the function again
        }else{
          if(typeof (obj[nodeName].push)=="undefined"){
            var old=obj[nodeName];
            obj[nodeName]=[];
            obj[nodeName].push(old);
          }
          obj[nodeName].push(nsXMLToJSONDirty(item));
        }
      }
    }
    return obj;
  }

  function cleanObject(myobj,recurse){
    var myobjcopy=JSON.parse(JSON.stringify(myobj));
    for(var i in myobjcopy){
      if(recurse && typeof myobjcopy[i]==='object'){
        if(i=="#text"){
          delete myobjcopy[i];
        } else {
          //Check if it only contains a text object
          if(Object.keys(myobjcopy[i]).length==1){
            if(typeof myobjcopy[i]['#text'] != "undefined"){
              if(myobjcopy[i]['#text'] || myobjcopy[i]['#text']==0){
                myobjcopy[i]=myobjcopy[i]['#text'];
              }
            }
          }else{
            //Handle empty objects
            if(Object.keys(myobjcopy[i]).length==0){
              myobjcopy[i]=undefined;            
            }
          }
          if(myobjcopy[i]){
            myobjcopy[i]=cleanObject(myobjcopy[i],recurse);
          }
        }
      }
    }
    return myobjcopy;
  }
}

我最近有一个项目需要将xml转换为json,所以我写了下面的函数。

require(['N/xml'], function (xmlMod) {
//This function refer to https://davidwalsh.name/convert-xml-json
function xmlToJson(xmlNode) {
    // Create the return object
    var obj = Object.create(null);

    if (xmlNode.nodeType == xmlMod.NodeType.ELEMENT_NODE) { // element
        // do attributes
        if (xmlNode.hasAttributes()) {
            obj['@attributes'] = Object.create(null);
            for (var j in xmlNode.attributes) {
                if(xmlNode.hasAttribute({name : j})){
                    obj['@attributes'][j] = xmlNode.getAttribute({
                        name : j
                    });
                }
            }
        }
    } else if (xmlNode.nodeType == xmlMod.NodeType.TEXT_NODE) { // text
        obj = xmlNode.nodeValue;
    }

    // do children
    if (xmlNode.hasChildNodes()) {
        for (var i = 0, childLen = xmlNode.childNodes.length; i < childLen; i++) {
            var childItem = xmlNode.childNodes[i];
            var nodeName = childItem.nodeName;
            if (nodeName in obj) {
                if (!Array.isArray(obj[nodeName])) {
                    obj[nodeName] = [
                        obj[nodeName]
                    ];
                }
                obj[nodeName].push(xmlToJson(childItem));
            } else {
                obj[nodeName] = xmlToJson(childItem);
            }
        }
    }

    return obj;
};

var str = '<?xml version="1.0"?><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">Hello World</TITLE><LINKSIN NUM="1102">Netsuite</LINKSIN><SPEED TEXT="1421" PCT="51"/></SD><SD><POPULARITY URL="davidwalsh.name/" TEXT="7131"/><REACH RANK="5952"/><RANK DELTA="-1648"/></SD></ALEXA>';

var xmlObj = xmlMod.Parser.fromString({
    text: str
});
var jsonObj = xmlToJson(xmlObj.documentElement);

log.debug('jsonObj', jsonObj);
});

cenvert 函数引用了 David Walsh 的函数,位于:https://davidwalsh.name/convert-xml-json 我刚刚修改它与 Netsuite 兼容。 希望对你有用。