2009-02-24 8 views
12

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

+0

あなたの「結果」は文字列を意味しますか、あなたは「すべて」「あなたの」「ベース」「ある」「属し」「」「私たち」を意味しましたか? –

+0

ミームが勝つ。ただ言って。 (便利な質問です) – CodeMouse92

答えて

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); 
} 
+0

それ自体が「必要」ではありません。もっとエレガントで簡単な方法、つまり1行のコマンドがあるかどうかは疑問でした。 –

+0

おそらく、この関数に試してみることができます:) – dirkgently

+2

新しい行で分割しますか?私には悪い考えのように見えます。ラベルに改行があるとどうなりますか? –

2

あなたの現在の実装では十分です。以下のためのワンライナーがありますように私は感じ

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; 
} 
0

:(。私はあなたがベクトルを使用していない限り、気にしないだろうけれども<>)あなたが作ることができる唯一の最適化は、Arrayコンストラクタに初期容量に渡すことですこれがどこかで...ああ。

質問:.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; 
    } 
+0

はメソッドであり、プロパティではありません。 var t:int = $ x.length()にする必要があります。確かにわかりませんが、長さノードを見つけようとしているので0になると思います。何も返さないので、intでキャストすると0になります。 – invertedSpear

4

この1つはかなりうまく機能:forループの本格的な使用にもかかわらず

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

を与えられたとして、論理的に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

+0

私はこのノードを試してみる必要があります... –

+0

@Ericあなたが試みたのであれば、すでに 'movieClips'に' x'が定義されていて、 'XMLLists'は' Arrays'にコーディングしていないと思われます。私はこれを修正し、 'forループと文字列' splits'を使って 'XMLList'方法がより良い方法であると主張し続けます。 – dlamblin

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()呼び出しで置き換えることで、属性を引き出すことができます。

+0

古い?道のりは良いです。 – Nevena

+0

それは本当に賢いです。 – CodeMouse92

+0

私はこれを好きではなく、好きです。 :< :> – Jono

関連する問題