2016-09-17 69 views
0

我已经看到许多版本的xml2json代码使用'@attributes',代码如下,我的问题是为什么不只是使用obj[attribute.nodeName] = attribute.nodeValue为什么在将XML转换为JSON时在代码中使用'@attributes'

// Changes XML to JSON 
function xmlToJson(xml) { 

    // Create the return object 
    var obj = {}; 

    if (xml.nodeType == 1) { // element 
     // do attributes 
     if (xml.attributes.length > 0) { 
     obj["@attributes"] = {}; 
      for (var j = 0; j < xml.attributes.length; j++) { 
       var attribute = xml.attributes.item(j); 
       obj["@attributes"][attribute.nodeName] = attribute.nodeValue; 
    //why not just use obj[attribute.nodeName] = attribute.nodeValue 
      } 
     } 
    } else if (xml.nodeType == 3) { // text 
     obj = xml.nodeValue; 
    } 

    // do children 
    if (xml.hasChildNodes()) { 
     for(var i = 0; i < xml.childNodes.length; i++) { 
      var item = xml.childNodes.item(i); 
      var nodeName = item.nodeName; 
      if (typeof(obj[nodeName]) == "undefined") { 
       obj[nodeName] = xmlToJson(item); 
      } else { 
       if (typeof(obj[nodeName].push) == "undefined") { 
        var old = obj[nodeName]; 
        obj[nodeName] = []; 
        obj[nodeName].push(old); 
       } 
       obj[nodeName].push(xmlToJson(item)); 
      } 
     } 
    } 
    return obj; 
}; 

的联系是here

+0

通常使用attributes属性来保存属性,常规的HTML DOM元素对'element.attributes'做同样的事情,因为属性不是属性。不知道为什么使用@符号,但在其他语言中解析XML数十年时,它已被用于这种方式,例如PHP等。 – adeneo

回答

0

我知道现在。区分元素属性和子元素属性。当他们彼此相等时,这个技巧就会起作用。

喜欢:<tag attr= "Val"> <attr subattr="sub Val "></attr> </tag>

1

XML格式具有更宽的范围比JSON数据结构。可以提供一个互相让步一块信息既可以作为节点:

<foo>33</foo> 

...或属性:

<bar foo="33"> 

相反,JSON没有提供任何其他方式比对象属性:

{"foo": 33} 

鉴于此限制,自动JSON到XML转换器的编写者需要一种方法来处理这种情况,并且使用任意前缀@已成为事实上的标准。