Um arquivo XML pode ser carregado pela aplicação usando somente as bibliotecas disponíveis pela Flex SDK, porém eu utilizo a biblioteca GreenSock tanto para animação quanto para a carga de arquivos.
Mais detalhes sobre o carregamento usando esta biblioteca podem ser encontrados aqui, ou na documentação da biblioteca.
Arquivo XML usado no exemplo:
<?xml version="1.0" encoding="UTF-8"?>
<playlist>
<music id="687" >
<name>Bad To The Bone</name>
<album>Live In '99</album>
<artist>George Thorogood</artist>
<duration>6:27</duration>
</music>
<music id="251" >
<name>Paranoid</name>
<album>Paranoid</album>
<artist>Black Sabbath</artist>
<duration>2:53</duration>
</music>
<music id="7584" >
<name>Born To Be Wild</name>
<album>Born To Be Wild</album>
<artist>Steppenwolf</artist>
<duration>1:29</duration>
</music>
</playlist>
Abaixo o código AS3 para carregar o arquivo:
// url request com o endereço do xml a ser carregado
var xmlUrlRequest:URLRequest = new URLRequest("assets/xml/XMLReading_sample.xml");
// instancia o carregador do xml
var xmlLoader:XMLLoader = new XMLLoader(xmlUrlRequest, {onComplete:xmlLoaded});
// inicia o carregamento do xml
xmlLoader.load();
Veja que nos parâmetros de construção do objeto XMLLoader é enviado a função que deverá ser executada ao termino da carga do arquivo, também é possivel tratar o evento de progresso e erro ao carregar (onProgress, onError) .
Abaixo na função chamada ao termino da carga do arquivo XML, podemos ver como é extraído os dados lidos.
Com os dados lidos do arquivo é criado um objeto XML.
Com um comando de loop ‘for’ é percorrido todos os elementos ‘music’ dentro da raiz ‘playlist’.
Para cada elemento ‘music’ encontrado é adicionado um novo elemento no datagrid com os dados do elemento xml.
Para ler o atributo de um elemento use: elemento.@atributo1
Para recuperar o valor de um elemento apenas use o nome do mesmo: elemento.elementofilho
Desta forma se for necessário também pode ler os atributos dos elementos filhos:
elemento.elementofilho.@iatributo1, elemento.elementofilho.@atributo2
/**
* ao terminar o carregamento do xml executa esta função
*/
private function xmlLoaded(event:LoaderEvent):void
{
// preenche a area de texto com o conteúdo do arquivo xml
fileContent.text = (XMLLoader(event.currentTarget)).content;
// instancia um xml com os dados lidos do arquivo
xml = new XML((XMLLoader(event.currentTarget)).content);
musics = new ArrayCollection();
// preenche o array com os nomes das músicas
for(var i:Number = 0; i < xml.music.length(); i++){
// adiciona um novo item ao arraycollection das musicas
// atributo id presente no elemento 'música' do xml
// elementos filhos do elemento música
// name
// album
// artist
// duration
musics.addItem({id:xml.music[i].@id, name:xml.music[i].name, album:xml.music[i].album, artist:xml.music[i].artist, duration:xml.music[i].duration});
}
// adiciona os itens carregados do xml ao datagrid
musicList.dataProvider = musics;
}
Aqui o cógido do datagrid para comportar os dados lidos do XML
<s:DataGrid id="musicList" x="10" y="261" width="580" >
<s:columns>
<s:ArrayList>
<s:GridColumn width="40" dataField="id" headerText="ID"></s:GridColumn>
<s:GridColumn dataField="name" headerText="Música"></s:GridColumn>
<s:GridColumn dataField="album" headerText="Álbum"></s:GridColumn>
<s:GridColumn dataField="artist" headerText="Artista"></s:GridColumn>
<s:GridColumn dataField="duration" headerText="Duração"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>