【问题标题】:XML To JSON Conversion with attributes带有属性的 XML 到 JSON 转换
【发布时间】:2018-04-16 11:23:47
【问题描述】:

我正在尝试将 XML 转换为 JSON。我面临的挑战是我的 xml 在所有标记中都将 @attributes 名称作为“值”。在将 xml 转换为 JSON 时,我正在使用以下代码。

var xml = "<Message><id value="123"></id><type value="Test"></type></Message>"
var json = XMLtoJSON(xml, ["type", "space", "xmlns", "html"]);
var result = JSON.stringify(json)    
function XMLtoJSON(xml, ignored) {
          var r, children = xml.*, attributes = xml.@*, length = children.length();
          if(length == 0) {
            r = xml.toString();
          } else if(length == 1) {
            var text = xml.text().toString();
            if(text) {
              r = text;
            }
          }
          if(r == undefined) { 
            r = {};
            for each (var child in children) {
             var name = child.localName();
             var json = XMLtoJSON(child, ignored);
             var value = r[name];
             if(value) {
               if(value.length) {
                 value.push(json);
               } else {
                 r[name] = [value, json]
               }
             } else {
               r[name] = json;
             }
            }
          }
          if(attributes.length()) {
            var a = {}, c = 0;
            for each (var attribute in attributes) {
              var name = attribute.localName();
              if(ignored && ignored.indexOf(name) == -1) {
                a["_" + name] = attribute.toString();
                c ++;
              }
            }
            if(c) {
              if(r) a._ = r;
              return a;
            }
          }

          return r;
        }

输入 XML:

<Message><id value="123"></id><type value="Test"></type></Message>

实际输出:

{"id":{"_value":"123"},"type":{"_value":"Test"}}

预期输出:

{"id":"123","type":"Test"}

指导我在哪里缺少获得预期输出的部分。

问候, nkn1189

【问题讨论】:

  • 那不是有效的 JavaScript。 xml.* 应该做什么?
  • 嗨,Str,我正在使用一些特定于我的应用程序的自定义 javascript,它提供的输出没有任何错误。 XML.* 将给出 XML 的子节点

标签: javascript json xml


【解决方案1】:

你认为如果你这样做对你有用吗?

将该解析器的实际输出放入此函数:

function convertToExpectedOutput(obj){
    var result = {}
    for (var i in obj){
        if (i == "_value")
           return obj[i];
        else
           result[i] = convertToExpectedOutput(obj[i])
    }
    return result;
}

convertToExpectedOutput(actualOutput)

因此,对于您的数组,将 convertToExpectedOutput 挂到这种方式,它会给出预期的结果:

function convertToExpectedOutput(obj){
    var result = {}
    for (var i in obj){
        if (i == "_value")
           return obj[i];
        else
        if (Array.isArray(obj[i])){
           result[i] = [];
           arr = obj[i]
           for (var j in arr)
              result[i].push(convertToExpectedOutput(arr[j]))
        }  
        else
           result[i] = convertToExpectedOutput(obj[i])
    }
    return result;
}

【讨论】:

  • 感谢@Hans Yulian 的即时回复,您的解决方案也奏效了...
  • 嗨汉斯,我已经使用了上面的代码,这里是输出中的观察结果。实际输出{"id":{"_value":"312480"},"Item":[{"language":{"_value":"English"}},{"language":{"_value":"France"}},{"language":{"_value":"German"}}]}
  • 嗨,汉斯,我已经使用了上面的代码,并通过分析 JSON 中的数组对象更改为具有索引的普通对象输入 XML:&lt;Book&gt;&lt;id value="12345"/&gt;&lt;Item&gt;&lt;language value="English"/&gt;&lt;/Item&gt;&lt;Item&gt;&lt;language value="France"/&gt;&lt;/Item&gt;&lt;Item&gt;&lt;language value="German"/&gt;&lt;/Item&gt;&lt;/Book&gt; 实际输出:{"id":"12345","Item":{"0":{"language":"English"},"1":{"language":"France"},"2":{"language":"German"}}} 预期输出:{"id":"312480","Item":[{"language":"English"},{"language":"France"},{"language":"German"}]}
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2021-10-26
  • 1970-01-01
  • 2023-03-15
  • 2018-07-23
  • 1970-01-01
相关资源
最近更新 更多