12

ループを使用せずに、次の 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でこれを行う簡単な方法があるかどうか疑問に思っていました

4

6 に答える 6

14

これはうまく機能しますが、XMLList のいくつかの奇妙な構文を使用します。必要に応じて、最後のステートメントを 1 行に入れることができます。

    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())
);  

toString() 呼び出しを attribute() 呼び出しに置き換えて、属性を引き出すことができます。

于 2010-08-24T15:34:01.523 に答える
4

これはかなりうまくいきます:

public static function xmlListToArray($x:XMLList):Array {           
    var a:Array=[], i:String;
    for (i in $x) a[i] = $x[i];
    return a;
}
于 2009-12-06T00:04:56.937 に答える
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.

私はこれを自分でフラッシュで確認しました。個人的には、オプションの行や参照などを使用することは理にかなっていますが、labels[0]ここでは必要ありません。

出力として文字列の配列を求めていることは知っていますが、基本的には、なぜ XMLList オブジェクトの配列アクセサーだけを使用できないのかを尋ねているのです。

これについての細かいウォークスルーがあります: Senocular on E4X

于 2010-01-20T03:08:01.227 に答える
2

現在の実装で十分です。できる唯一の最適化は (Vector.<> を使用していない限り気にしませんが)、初期容量を 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;
}
于 2009-02-25T10:32:02.710 に答える
1

forループは AS で非常に高速です。なぜそれが必要なのですか?しかし、これを試すことができます:

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);
}
于 2009-02-24T20:41:11.053 に答える
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;
    }
于 2009-12-05T23:32:00.060 に答える