2009-02-24 4 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

Meme sneak победить. Просто говорю. (И полезный вопрос.) – 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

Ваша нынешняя реализация более чем достаточна. (., Хотя я бы не стал беспокоиться, если вы не используете Vector <>) только оптимизации вы могли бы сделать, чтобы пройти в начальной емкости в конструктор массива:

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

я чувствую, что есть один вкладыш для это где-то там ... ну ладно.

вопрос: почему. Длина провал здесь? (Всегда 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

для длины XML - это метод, а не свойство. он должен быть var t: int = $ x.length(). Не уверен, но я думаю, что вы получаете 0, потому что он пытается найти узел длины, не может так ничего не возвращает, что при преобразовании с int становится 0. – invertedSpear

4

Это один работает довольно хорошо:

public static function xmlListToArray($x:XMLList):Array {   
    var a:Array=[], i:String; 
    for (i in $x) a[i] = $x[i]; 
    return a; 
} 
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.

+0

Мне нужно попробовать это ... –

+0

@ Эрик Belair, если вы пробовали его, так как вы, вероятно, обнаружили проблемы с 'x', которые уже определены в большинстве' movieClips', а 'XMLLists' не набирают принуждение к' Arrays', как я и ожидал. Я исправил это и продолжаю настаивать на том, что метод XMLList является лучшим способом для циклов 'for' и строковых разделителей. – 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

Смежные вопросы