如何在没有循环的情况下将简单的XMLList转换为字符串数组?

时间:2009-02-24 20:35:30

标签: xml flex arrays actionscript xmllist

如何在不使用循环的情况下将以下XMLList转换为字符串数组?

<labels>
    <label>All</label>
    <label>your</label>
    <label>base</label>
    <label>are</label>
    <label>belong</label>
    <label>to</label>
    <label>us.</label>
</labels>

我想要这个结果:

["All","your","base","are","belong","to","us."]

现在,我正在做以下事情:

var labelsArray:Array /* of String */ = [];

for each (var labelText:String in labels.label)
{
    labelsArray.push(labelText);
}

我想知道在ActionScript 3.0中是否有更简单的方法来执行此操作

6 个答案:

答案 0 :(得分:14)

这很好但是使用了一些奇怪的XMLList语法。如果需要,最后一个语句可以放在一行上。

    var labels:XML = <labels>
                    <label>All</label>
                    <label>your</label>
                    <label>base</label>
                    <label>are</label>
                    <label>belong</label>
                    <label>to</label>
                    <label>us.</label>
                </labels>;

var labelsArray:Array /* of String */ = [];

labels.label.
(
              labelsArray.push(toString())
);  

可以使用attribute()调用替换toString()调用以拉出属性。

答案 1 :(得分:4)

这个很好用:

public static function xmlListToArray($x:XMLList):Array {           
    var a:Array=[], i:String;
    for (i in $x) a[i] = $x[i];
    return a;
}

答案 2 :(得分:2)

您当前的实施绰绰有余。你可以做的唯一优化(虽然我不会打扰,除非你使用Vector。&lt;&gt;)是将初始容量传递给Array构造函数:

var xmlLabels : XMLList = labels.label;
var labelsArray:Array /* of String */ = new Array(xmlLabels.length);

var index : int = 0;

for each (var labelText:String in xmlLabels)
{
    labelsArray[index++] = labelText;
}

答案 3 :(得分:2)

尽管for循环的认真使用并且在给定XML对象的逻辑上工作,但这是XMLList的工作。
最好看起来像这样:

var xml:XML = 
<labels>
    <label>All</label>
    <label>your</label>
    <label>base</label>
    <label>are</label>
    <label>belong</label>
    <label>to</label>
    <label>us.</label>
</labels>
;
var list:XMLList = xml.label;
var labels:XMLList = list.text(); //Optional
trace(list[0]);
trace(list[3]);
trace(list[6]);

这将输出:

All
are
us.

我自己在flash中证实了这一点。就个人而言,使用可选行并引用labels[0]等对我来说是有意义的,但这里不需要。

我知道你要求输出一个字符串数组,但基本上我问你为什么不能只使用XMLList对象的数组访问器。

这是一个很好的演练:Senocular on E4X

答案 4 :(得分:1)

AS中的

for循环非常快。你为什么需要那个?但你可以尝试一下:

private function toArray():void {
    var xml:XML = <labels>
               <label>all</label>
               <label>your</label>
              </labels>;

    var array:* = xml.label.text().toXMLString().split("\n") ;
    trace(array as Array);
}

答案 5 :(得分:0)

我觉得那里有一个单行的地方......好吧。

问题:为什么.length会在这里失败? (总是0)

 public static function xmlListToArray($x:XMLList):Array {
        var t:int = $x.length;
        var a:Array=new Array(t), i:int;
        for (i = 0; i < t; ++i) a[i] = $x[i];
        return a;
    }