2009-02-24 8 views
12

루프를 사용하지 않고 다음 XMLList를 문자열 배열로 변환하려면 어떻게해야합니까? 나는 다음과 같은 일을하고, 지금간단한 XMLList를 루프없이 문자열 배열로 변환하려면 어떻게해야합니까?

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

:

<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 */ = []; 

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

그 자체로 "필요"하지 마십시오. 더 우아하고 간단한 방법 (한 줄 명령)이 있는지 궁금합니다. –

+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

이 하나가 꽤 잘 작동 : 주어진대로 XML 개체에서 작업 본격화 for 루프의 사용과 논리적에도 불구하고

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

을,이 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

@ 1을 시도해야합니다. –

+0

@Eric 당신이 그것을 시도했다면 Belair는 이미 대부분의'movieClips'에'x'가 정의되어 있고 XMLLists가'Arrays'에 강제로 타입을 넣지 않았다고 생각했습니다. 나는 이것을 고쳤으며,'for'루프와 문자열'splits '을 통해 XMLList 메소드가 더 나은 방법이라고 주장하기를 계속한다. – dlamblin

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

toString() 호출은 attribute() 호출로 대체하여 속성을 제거 할 수 있습니다.

+0

오래된? 더 나은 방법을 위해'for'! – Nevena

+0

그건 정말 영리합니다. – CodeMouse92

+0

나는 그것을 좋아하지 않을뿐만 아니라 이것을 좋아한다. : < :> – Jono

관련 문제