por Ivan da Silveira

Lendo XML com biblioteca GreenSock

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>

 

Comentários

Carregando comentários

Postar um novo comentário



Processando...