Recientemente ha habido varias preguntas en MIF sobre el uso de XML como dataProvider, o mas bien de cómo convertir este XML a un ArrayCollection que es usado como dataProvider. Mi preferencia personal es el uso de un XMLListCollection en vez de un ArrayCollection cuando los datos originales están en XML. El XMLListCollection conserva la estructura del XML y además ofrece todas las funciones e4x para el manejo de XML. A su vez, esto ayuda al programador a entenderse con solo una estructura de datos tanto para desarrollar como para depurar. Sin embargo, muchos de los ejemplos que usamos para aprender Flex usan o esperan un ArrayCollection. La necesidad de crear un ArrayCollection usando XML surge después de que hemos probado el ejemplo original y que después queremos probar con XML, ya que probablemente será nuestra fuente de datos en nuestra aplicación final.
Asi que aqui esta un ejemplo que usa un for each para leer el XML y crear cada uno de los registros en un ArrayCollection. El secreto esta en pensar en que el nodo de un XML debe ser equivalente a un registro en un ArrayCollection con sus respectivos atributos. El ejemplo muestra dos dataGrid uno usando el ArrayCollection original y el otro usando tambien un ArrayCollection pero creado a partir de un XML.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()" >
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;import mx.collections.XMLListCollection;
[Bindable]
private var miXmlCollection:XMLListCollection;
[Bindable]
private var miArrayCollection:ArrayCollection;
// El ArrayCollection original
[Bindable]
private var originalArrayCollection:ArrayCollection = new ArrayCollection([
{nombre:"Oscar", apellido:"Cortes", email:"ocortess@fake.com"},
{nombre:"Ines", apellido:"Cortes", email:"icortes@fake.com"},
{nombre:"Marina",apellido:"Santos", email:"marina@kafe.com"},
{nombre:"Harald", apellido:"Cortes", email:"harald@fake.com"}
]);
public function initApp():void
{
var oElemento:Object;
// El XMl debe tener una estructura basada en el ArrayCollection original (originalArrayCollection)
var miXML:XML =
<data>
<dato>
<nombre>Oscar</nombre>
<apellido>Cortes</apellido>
<email>ocortess@fake.com</email>
</dato>
<dato>
<nombre>Ines</nombre>
<apellido>Cortes</apellido>
<email>icortes@fake.com</email>
</dato>
<dato>
<nombre>Marina</nombre>
<apellido>Santos</apellido>
<email>marina@kafe.com</email>
</dato>
<dato>
<nombre>Harald</nombre>
<apellido>Raunjak</apellido>
<email>harald@fake.com</email>
</dato>
</data>
miArrayCollection = new ArrayCollection();
// Por cada nodo, crea un nuevo Object, añade los atributos de acuerdo al XML e insertalo en un Array Collection
for each ( var element:XML in miXML.elements() )
{
oElemento = new Object();
oElemento.nombre = element.nombre;
oElemento.apellido = element.apellido;
oElemento.email = element.email;
miArrayCollection.addItem(oElemento);
}
}
]]>
</mx:Script>
<mx:VBox width="450" height="400">
<!-- Data Grid que usa el ArrayCollection -->
<mx:DataGrid width="100%" height="100%" dataProvider="{originalArrayCollection}"/>
<!-- Data Grid que usa tambien un ArrayCollection el cual fue creado usando un XML como fuente-->
<mx:DataGrid width="100%" height="100%" dataProvider="{miArrayCollection}"/>
</mx:VBox></mx:Application>