Как преобразовать простой 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
Ответы
Ответ 1
Это работает хорошо, но использует некоторый нечетный синтаксис 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() для извлечения атрибутов.
Ответ 2
Это работает очень хорошо:
public static function xmlListToArray($x:XMLList):Array {
var a:Array=[], i:String;
for (i in $x) a[i] = $x[i];
return a;
}
Ответ 3
Ваша текущая реализация более чем достаточна. Единственная оптимизация, которую вы могли бы сделать (хотя я бы не стал беспокоиться, если вы не используете 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;
}
Ответ 4
Несмотря на серьезное использование циклов 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.
Ответ 5
Циклы 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);
}
Ответ 6
Я чувствую, что там один лайнер для этого где-то там... ну хорошо.
вопрос: почему здесь не работает .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;
}