0

我有如下所示的 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[Blue Hawaiian[White Rum => 1, Blue Curaco => 2, Pineapple Juice => 1...], name[射击 => 数量,...]]

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

任何帮助,将不胜感激。

4

2 回答 2

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"]["name"] 来操作我这里没有考虑数组。对于像cock_tail这样的数组,您需要检查它是否已经在obj中,如果是则将其推入。

于 2011-11-13T12:53:24.997 回答
1

您要做的是创建一个对象图,您可以通过递归遍历 XML 树来轻松完成。每个 JavaScript 对象都是一个映射(也称为“关联数组”,但我不喜欢这个术语,因为它们不是数组)。对象的属性可以通过带有文字 ( ) 的点分符号和obj.foo带有字符串[]( obj["foo"]) 的符号来访问:

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

您可以看到在[]遍历结构时如何轻松地使用符号与字符串名称组合来构建图形。您将访问与您的示例非常相似的结果,只是略有不同。我可能会选择以鸡尾酒名称作为键的地图,然后有一个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. 创建一个对象。这很容易:

    var obj = {};
    
  2. 使用点分表示法向对象添加属性:

    obj.propertyName = value;
    
  3. 使用括号表示法向对象添加属性,属性名称来自字符串表达式而不是文字:

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

    在您的情况下,您可能会从 XMLnodeNamenodeValue.

  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,那么您应该可以继续根据遍历结果构建对象图。我没有编写实际的代码来执行此操作,因为同样,在您希望如何构建对象图方面需要做出许多决定,这完全取决于您想要如何做。

于 2011-11-13T12:12:37.027 回答