2011-11-13 41 views
0

我有看起来像这样的XML数据:的Javascript XML数据到关联数组

<?xml version='1.0' encoding='ISO-8859-1'?> 
<cocktail_list> 
<cocktail> 
<name> Blue Hawaiian </name> 
<ingredient> 
<quantity>1</quantity> 
<shot>White Rum</shot> 
</ingredient> 
<ingredient> 
<quantity>1</quantity> 
<shot>Blue Curacao</shot> 
</ingredient> 
<ingredient> 
<quantity>2</quantity> 
<shot>Pineapple Juice</shot> 
</ingredient> 
<ingredient> 
<quantity>1</quantity> 
<shot>Coconut Cream</shot> 
</ingredient> 
</cocktail> 
<cocktail>... 
</cocktail_list> 

使用JavaScript我想创建嵌套/缔合阵列(或使用对象)的样子: arrayName中[蓝夏威夷语[白朗姆酒=> 1,蓝库拉库=> 2,菠萝汁=> 1 ...],名称[shot => quantity,...]]

现在我知道如何遍历我的XML,但是我不知道如何将其转换为我的数组。

任何帮助,将不胜感激。

+0

JavaScript没有关联数组,它是可以用作关联数组的对象。 – stivlo

+0

@stivio:JavaScript对象**是**关联数组(相对于“可以用作”)。 :-) –

+0

@ T.J.Crowder我认为JavaScript对象不仅仅是关联数组,而是因为它们可以被声明为对象字面值,但也可以作为函数,并且它们包含其他函数。对象可以用构造函数创建。我错过了什么? – stivlo

回答

1

你想要做的是创建一个对象图,你可以随心所欲地用你的XML树进行递归遍历。每个JavaScript对象都是一张地图(又名“关联数组”,但我不喜欢这个词,因为它们不是数组)。

var obj = {};   // A blank object 
obj.foo = "bar";   // Now it has a property called "foo" 
console.log(obj.foo); // Accessing the property via dotted notation and a literal 
console.log(obj["foo"]); // You can also use [] notation and a string 
var s = "foo"; 
console.log(obj[s]);  // And of course the string can be the result of any expression, 
         // including coming from a variable 

你可以看到[]符号与字符串名称如何组合:一个对象的属性可以通过点符号与文字(obj.foo),通过[]符号用字符串(obj["foo"])访问当你遍历你的结构时,可以很容易地使用它来建立一个图表。您可以非常类似于您的示例访问结果,只是略有不同。我可能会选择通过鸡尾酒名称来键入地图,然后有一个ingredients属性列出成分(作为对象数组,或者只是使用成分名称作为关键字)。但你可以选择不具备ingredients财产和代替有鸡尾酒对象直接包含的成分,例如:

console.log(cocktails["Blue Hawaiian"]["White Rum"].name);  // "shot" 
console.log(cocktails["Blue Hawaiian"]["White Rum"].quantity); // 1 

或课程的

var bh = cocktails["Blue Hawaiian"]; 
console.log(bh["White Rum"].name);  // "shot" 
console.log(bh["White Rum"].quantity); // 1 

有很多,你可以不同的方式根据您想要访问它的方式和您的个人风格来构建您的结果对象图。

的组成部件:

  1. 创建一个对象。这很简单:

    obj.propertyName = value; 
    
  2. 使用括号表示法与财产从传来的名字添加属性的对象:

    var obj = {}; 
    
  3. 用点号属性文字添加属性的物体字符串表达式,而不是从文字:

    obj["propertyName"] = value; 
    // or 
    var s = "propertyName"; 
    obj[s] = value; 
    // or even 
    var s1 = "property", s2 = "Name"; 
    obj[s1 + s2] = value; 
    

    在你的情况,你可能会从XML获得属性名称nodeNamenodeValue

  4. 将对象放入另一个对象中。这实际上只是分配给一个属性,在那里你将值是一个对象引用:

    var outer = {}; 
    var inner = {}; 
    inner.foo = "I'm foo";  // Putting the string "I'm foo" on propety `foo` 
    outer.bar = inner;   // Putting the `inner` object on the property `bar` 
    console.log(outer.bar.foo); // "I'm foo" 
    

既然你已经知道如何遍历你的XML,这应该让你去上建立一个来自遍历结果的对象图。我并没有编写实际的代码来做这件事,因为在你想如何构建你的对象图时,你需要做出很多决定,完全取决于你想如何去做。

+0

谢谢T.J.为了避免麻烦,将所有的信息都包含进来,但是我很难解决如何将其付诸实践。 对于我的“cocktail_list”中的每个“鸡尾酒”,我想要一个物体/数组,它看起来像: [名称[shot(key)=> quantity(value),shot(key)=> quantity(value) (key)=> quantity(value)] 其中“name”,“shot”和“quantity”的值取自XML。 然后,我将把这些对象/数组放在一个数组中,因为我需要能够比较用户对这个数组中的鸡尾酒所做的鸡尾酒。 谢谢, 尼克 – Nick

+0

@尼克:我添加了一些积木。 –

+0

非常感谢您的帮助T.J.,我会利用您提供的一些理论去解决问题。 – Nick

2

使用jquery.parseXML

var x = $.parseXML(xml_str); 
var obj = {}; 
$(x).find("*").each(function(){ 
    obj[this.nodeName] = $(this).text; 
}); 

然后你obj是一个JSON对象,你可以用OBJ操纵[ “cocktail_list”] [ “cock_tail”] [ “名称”] 我没有考虑数组在这里。对于像cock_tail这样的数组,你需要检查它是否已经在obj中,并且如果是的话就把它推入。

+0

好主意Phil,但是我不想使用jquery,因为这是Uni项目,所以我需要先学习JavaScript。 – Nick

+0

然后你可以使用window.DOMParser,你将不得不处理跨浏览器问题。你怎么能拒绝优雅的jQuery和我的解决方案。 :) – ComfortablyNumb

+0

因为我觉得在进入JQuery之前需要学习和理解Javascript。 – Nick