【问题标题】:Javascript XML Data to Associative ArrayJavascript XML 数据到关联数组
【发布时间】:2011-12-28 00:35:22
【问题描述】:

我的 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[shot => quantity, ...]]

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

任何帮助将不胜感激。

【问题讨论】:

  • JavaScript 没有关联数组,它是可以用作关联数组的 Object。
  • @stivio:JavaScript 对象关联数组(与“可以用作”相反)。 :-)
  • @T.J.Crowder 我认为 JavaScript 对象不仅仅是关联数组,因为它们可以声明为对象字面量,也可以声明为函数,并且它们包含其他函数。可以使用构造函数创建对象。我错过了什么?
  • @stivlo:它们是按原型层次结构排列的关联数组,可以通过多种方式创建(文字或通过 new 调用构造函数),但这不是t 改变它们是关联数组的事实。 :-) 另外,对象不包含函数,它们具有引用函数的属性。

标签: javascript xml arrays object associative


【解决方案1】:

使用 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中,如果是则将其推入。

【讨论】:

  • 好主意 Phil,但是我不想使用 jquery,因为这是一个 Uni 项目,所以我需要先学习 JavaScript。
  • 那么你可以使用window.DOMParser,你将不得不处理跨浏览器的问题。你怎么能拒绝优雅的 jquery 和我的解决方案。 :)
  • 因为我觉得在转向 JQuery 之前需要学习和理解 Javascript。
【解决方案2】:

您要做的是创建一个对象图,您可以轻松地通过递归遍历您的 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;
    

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

【讨论】:

  • 谢谢 T.J.麻烦您包含您拥有的所有信息,但是我无法弄清楚如何将其付诸实践。对于我的“cocktail_list”中的每个“鸡尾酒”,我想要一个如下所示的对象/数组: [name[shot(key) => quantity(value), shot(key) => quantity(value), shot(key ) => quantity(value)] 其中“name”、“shot”和“quantity”的值取自 XML。然后,我会将这些对象/数组中的每一个放入一个数组中,因为我需要能够将用户制作的鸡尾酒与该数组中的鸡尾酒进行比较。谢谢,尼克
  • @Nick:我添加了一些构建块。
  • 非常感谢您的帮助 T.J.,我将尝试使用您提供的一些理论。
猜你喜欢
  • 1970-01-01
  • 2014-08-22
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多