2009-02-24 15 views
12

¿Cómo puedo convertir la siguiente lista XMLList en una matriz de cadenas sin usar un bucle?¿Cómo puedo convertir una lista XML simple en una matriz de cadenas sin un bucle?

<labels> 
    <label>All</label> 
    <label>your</label> 
    <label>base</label> 
    <label>are</label> 
    <label>belong</label> 
    <label>to</label> 
    <label>us.</label> 
</labels> 

Quiero este resultado:

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

En este momento, estoy haciendo lo siguiente:

var labelsArray:Array /* of String */ = []; 

for each (var labelText:String in labels.label) 
{ 
    labelsArray.push(labelText); 
} 

Me preguntaba si hay una manera más sencilla de hacer esto en ActionScript 3.0

+0

Su 'resultado' implica que quiere una cadena, ¿quisieron decir ["Todos", "su", "base", "son", "pertenecen", "a", "nos"]? –

+0

Meme sneak win. Solo digo. (Y una pregunta útil.) – CodeMouse92

Respuesta

1

for Los bucles son extremadamente rápidos en AS. ¿Por qué lo necesitas? Pero podría darle una oportunidad:

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

No "lo necesito", per se. Me preguntaba si había una manera más elegante/más simple de hacerlo, es decir, un comando de una línea. –

+0

Tal vez ahora podría probar esta función :) – dirkgently

+2

¿Separar en una nueva línea? Me parece una mala idea. ¿Qué pasa si hay una nueva línea en la etiqueta? –

2

Su implementación actual es más que suficiente. (., Aunque no me molestaría menos que esté utilizando vectorial <>) La única optimización que podría hacer es pasar en la capacidad inicial en el constructor 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; 
} 
0

me siento como si hubiera una sola línea de esto por ahí en algún lugar ... bueno.

pregunta: ¿por qué .length falla aquí? (Siempre 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

para XML length es un método, no una propiedad. debe ser var t: int = $ x.length(). No estoy seguro, pero creo que obtienes 0 porque está tratando de encontrar un nodo de longitud, no puede, así que no devuelve nada, que cuando se lanza con int se convierte en 0. – invertedSpear

4

Esta funciona bastante bien:

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

A pesar de los usos serios de for bucles y lógicamente que trabajan en el XML objeto como dado, este es un trabajo para XMLList.
Se vería mejor algo como esto:

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

Esto seria:

All 
are 
us. 

He confirmado esto en flash de mí mismo. Personalmente, tiene sentido para mí usar la línea opcional, y hacer referencia al labels[0], etc., pero eso no es necesario aquí.

Sé que está pidiendo una serie de cadenas como salida, pero básicamente le pregunto por qué no puede usar simplemente los accesores de matriz de un objeto XMLList.

Aquí hay un buen recorrido sobre eso: Senocular on E4X.

+0

Voy a tener que probar esto ... –

+0

@Eric Belair si lo probaste tal como fue, probablemente ya encontraste problemas con 'x' en la mayoría de' movieClips' y 'XMLLists' no escriba coercing en' Arrays' como esperaba. He solucionado esto y continúo insistiendo en que el método 'XMLList' es la mejor manera sobre' for' loops y string 'splits'. – dlamblin

14

Esto funciona bien, pero utiliza una sintaxis impar de XMLList. La última declaración se puede colocar en una línea si lo desea.

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

La llamada toString() se puede reemplazar con una llamada de atributo() para extraer atributos.

+0

viejo? mucho mejor que 'para'! – Nevena

+0

Eso es realmente inteligente. – CodeMouse92

+0

Me gusta esto, además de que no me gusta. : < :> – Jono

Cuestiones relacionadas