Как я могу преобразовать простой 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

12 голосов | спросил Eric Belair 24 FebruaryEurope/MoscowbTue, 24 Feb 2009 23:35:29 +0300000000pmTue, 24 Feb 2009 23:35:29 +030009 2009, 23:35:29

6 ответов


0

Это хорошо работает, но использует какой-то странный синтаксис 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 () для извлечения атрибутов.

ответил Densefog 24 PM00000070000000131 2010, 19:34:01
0

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

public static function xmlListToArray($x:XMLList):Array {           
    var a:Array=[], i:String;
    for (i in $x) a[i] = $x[i];
    return a;
}
ответил one giant media 6 SunEurope/Moscow2009-12-06T03:04:56+03:00Europe/Moscow12bEurope/MoscowSun, 06 Dec 2009 03:04:56 +0300 2009, 03:04:56
0

Ваша текущая реализация более чем достаточна. Единственная оптимизация, которую вы могли бы выполнить (хотя я не стал бы беспокоиться, если бы вы не использовали Vector. & Lt;>), это передать начальную емкость в конструктор 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;
}
ответил Richard Szalay 25 FebruaryEurope/MoscowbWed, 25 Feb 2009 13:32:02 +0300000000pmWed, 25 Feb 2009 13:32:02 +030009 2009, 13:32:02
0

Несмотря на активное использование циклов 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 на E4X .

ответил dlamblin 20 Jam1000000amWed, 20 Jan 2010 06:08:01 +030010 2010, 06:08:01
0
Циклы

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);
}
ответил dirkgently 24 FebruaryEurope/MoscowbTue, 24 Feb 2009 23:41:11 +0300000000pmTue, 24 Feb 2009 23:41:11 +030009 2009, 23:41:11
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;
    }
ответил one giant media 6 SunEurope/Moscow2009-12-06T02:32:00+03:00Europe/Moscow12bEurope/MoscowSun, 06 Dec 2009 02:32:00 +0300 2009, 02:32:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132