Javascript对象到XML具有多个级别的字符串

时间:2013-03-06 21:12:20

标签: javascript xml object recursion stringify

我有一个多维Javascript对象,我可以使用.stringify方法轻松转换为JSON字符串。我正在尝试编写一个函数来执行类似的操作,但是使用XML,标记,格式。问题是,我希望它能够处理任意数量的维度。

假设我有以下多维对象,其值如下:

object['annualrevenues']['option0']['ID'] = 1;
object['annualrevenues']['option0']['text'] = '$50mil';
object['annualrevenues']['option1']['ID'] = 2;
object['annualrevenues']['option1']['text'] = '$100mil';
object['annualrevenues']['option2']['ID'] = 3;
object['annualrevenues']['option2']['text'] = '$200mil';

我想构建一个像这样的字符串:

var xmlText = <xml><annualrevenues><option0><ID>1</ID><text>$50</text></option0></annualrevenues></xml>

作为对contentType'XMLDOC'的响应返回的内容将如下所示:

<xml>
  <annualrevenues>
    <option0>
      <ID>1</ID>
      <text>$50</text>
    </option0>
  </annualrevenues>
</xml>

所以我有以下功能:

var xmlText = '<xml>';
    xmlText += formatXMLSubObjects(objText,xmlText);

function formatXMLSubObjects(objText,xmlText){
  for (prop in objText) {
    if (typeof objText[prop] == 'object') {
        xmlText += '<'+prop+'>';
        for (subProp in objText[prop]) {
            if (typeof objText[prop][subProp] == 'object') {
                // Run the function again as recursion
                xmlText += formatXMLSubObjects(objText[prop][subProp],xmlText);
            }
            else {
                xmlText += '<' + subProp + '>' + objText[prop][subProp] + '</' + subProp + '>';
            }
        }
        xmlText += '</'+prop+'>';
    }
    else {
        xmlText += '<'+prop+'>'+objText[prop]+'</'+prop+'>';
    }
  }
return xmlText;
}

问题是当formatXMLSubObjects函数从第二次调用返回时,第一次调用中的原始对象已被覆盖,现在是未定义的。

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:2)

在函数内移动 xmlText 的定义,并使用外部的另一个变量来包含初始有效负载,以及for循环中的局部变量,否则它们被认为是全局的并被覆盖,并且不会将xmlText提前传递给调用,但每次只是将结果与前一个结果连接起来。

function formatXMLSubObjects(objText) {
   var xmlText = ""; // this will contain only this chunk of the object

   for (var prop in objText) {
      xmlText += '<'+prop+'>'; // place the tag anyway
      if (typeof objText[prop] == 'object') {
            xmlText += formatXMLSubObjects(objText[prop]); // if it's an object recurse
      } else {
            xmlText += objText[prop]; // ... otherwise just add the value (this will work only for simple values
      }
   xmlText += '</' + prop + '>';
   }
   return xmlText;
}

var xml = '<xml>';
xml += formatXMLSubObjects(obj);
xml += '</xml>';

看看这个小提琴:http://jsfiddle.net/vZjAP/