Olá pessoal. Este código que irei compartilhar aqui, surgiu de uma grande necessidade minha: pesquisar meus MP3’s. Eu tinha uma lista em xml gerada por um programa de cadastro de cd’s, mas no meu trabalho não podia instalar o programa, daí então resolvi fazer a minha própria busca nesses xmls.
Versão de AS: ActionScrip 2.0
Compatibilidade: Flash Player 6 ++
Dificuldade de produção: 6
Dificuldade de aplicação: 4
1º O código utiliza as classes XML, String, DataGrid e DataGridColumn, Array, e consiste na lógica abaixo:
- Existe um arquivo xml principal, que contém a lista dos outros xmls a serem pesquisados. Esse xml é importado e armazenado em uma matriz (dbXmls) logo no início do filme.
- Ao clicar no botão de pesquisar, o AS constrói uma base de dados em uma matriz (dbDados).
- Sempre que efetuar uma pesquisa, o AS ve se a base já foi contruída, se não foi, a constrói, caso contrário, já parte para a busca.

2º Código do primeiro frame:
//cria variáveisvar xmls:XML = new XML();
xmls.ignoreWhite = true;
var dbXmls:Array = new Array(); //neste array ficarão a referencia aos xmls
var dbDados:Array = new Array(); //aqui ficarão os dados
var criados:Object = new Object(); //objeto que verá se o xml já foi criado no dbDados
//carrega a lista de xmls no dbXmls
xmls.onLoad = function() {
for (i=0; i<xmls.childNodes[0].childNodes.length; i++) {
dbXmls.push(xmls.childNodes[0].childNodes[i].childNodes);
}
nextFrame();
};
//manda carregar a lista
xmls.load(“xml/MP3s.xml”);
//prototype replace
String.prototype.replace = function(orig, replac, z) {
var dbLetras:Array = this.split(”);
var dbSubs:Array = replac.split(”);
if (orig.length>1) {
var strRep = dbLetras.join(”);
while (strRep.indexOf(orig)>=0) {
var ind = this.indexOf(orig);
var strAdd = dbSubs.join(”);
dbLetras.splice(ind,orig.length,strAdd);
strRep = dbLetras.join(”);
}
} else {
if (z == undefined) {
z = this.lastIndexOf(orig);
}
for (var i = 0, n = 0; i<dbLetras.length && n<z; i++) {
if (dbLetras[i] == orig) {
dbLetras[i] = replac;
n++;
}
}
}
return dbLetras.join(”);
};
stop();
3º Código do segundo frame
//importando classesimport mx.controls.gridclasses.DataGridColumn;
//função de adição
var keyw:String = new String();
var dbResults:Array = new Array();
var xmlResult:XML = new XML();
var myDataGrid:mx.controls.DataGrid;
xmlResult.ignoreWhite = true;
var ini = 0;
var atual;
var arraysCriados:Boolean = false;
var numResults;
//ação do botão que inicia a busca
search.onRelease = function() {
if (keyword.text == “”) {
//se não tiver digitado nada, avisa
labelText = “Informe uma palavra para busca…”;
} else {
//manda construir o array de dados
construirArray();
}
};
String;
function limpaDataGrid() {
myDataGrid.removeAll();
// removeItemAt
}
//função que grava os registros
function Buscar(keyw) {
labelText = “Realizando busca…”;
arraysCriados = true;
//trace(“Estou procurando por “+keyw);
//reseta busca anterior
limpaDataGrid();
numResults = 0;
//loop nos xmls
for (i=0; i<dbDados.length; i++) {
for (j=0; j<dbDados[i].length; j++) {
//search String
var searchString = dbDados[i][j][0].toString().toUpperCase();
keyw = keyw.toUpperCase();
var searchCD:String = dbXmls[i].toString();
searchCD = searchCD.replace(“.xml”, “”);
//procurando
if (searchString.indexOf(keyw)>=0) {
//trace(“Achamos: “+searchString);
var item_obj:Object = {Arquivo:searchString, CD:searchCD};
myDataGrid.addItem(item_obj);
numResults++;
}
}
}
labelText = “Foram encontrados “+numResults+” resultados.”;
}
//função contruir arrays
function construirArray() {
//se o array de dados não foi criado
if (!arraysCriados) {
//avisa que está construindo
labelText = “Contruindo base de informações. Aguarde…”;
//verifica se a referencia foi criada
if (criados[ini] != true) {
//se não, cria
criaArray(ini);
}
//passa valores
atual = ini;
ini++;
} else {
//se tiver todos criados, efetua abusca
Buscar(keyword.text);
}
}
//função que cria um array com resultados
function criaArray(a) {
//cria um array na posição do dbDados
dbDados[a] = new Array();
criados[a] = true;
//carrega o xml correspondente
//trace(“Carregando “+dbXmls[a]);
xmlResult.load(“xml/”+dbXmls[a]);
}
//função de onload
xmlResult.onLoad = function(a) {
//faz o loop e armazena
for (j=0; j<xmlResult.childNodes[0].childNodes.length; j++) {
//cria um novo subarray
dbDados[atual][j] = new Array(xmlResult.childNodes[0].childNodes[j].childNodes.length);
//verifica quantos campos e faz um loop para armazenar o conteúdo
for (a=0; a<xmlResult.childNodes[0].childNodes[j].childNodes.length; a++) {
dbDados[atual][j][a] = xmlResult.childNodes[0].childNodes[j].childNodes[a].childNodes;
}
}
//verifica se já carregou tudo
if (ini<dbXmls.length) {
//se não, manda construir o proximo
construirArray();
} else {
//se sim, seta a variavel de criação como true e manda buscar
arraysCriados = true;
Buscar(keyword.text);
}
};
//construção do dataGrid
function construirDataGrid() {
var coluna_arquivo:DataGridColumn = new DataGridColumn(“Arquivo”);
coluna_arquivo.width = 450;
var coluna_cd:DataGridColumn = new DataGridColumn(“CD”);
coluna_cd.width = 140;
myDataGrid.addColumn(coluna_arquivo);
myDataGrid.addColumn(coluna_cd);
}
construirDataGrid();
4º As funções:
Buscar() – Efetua a busca da palavra chave no array dbDados.
construirArray() - Função que constrói o dbDados.
criaArray(a) – Cria uma nova matriz correspondente ao cd, dentro de dbDados.
construirDataGrid() – Construção das colunas do dataGrid.
limpaGrid() – Limpa o dataGrid para a próxima pesquisa.
Você pode fazer o download dos arquivos clicando aqui.
Este artigo foi publicado no iMasters, clique aqui e confira.
Veja este exemplo funcionando aqui.
Abraços.









#1 por Alejandro em Março 10th, 2008
good job
#2 por Lucas em Maio 7th, 2008
Oi Weverton,
achei o máximo essa solução, porém tentei fazer o tutorial mais sou leigo no assunto e não consegui, tenho muitas fitas de vídeo e gostaria de usar esse modelo, você poderia me enviar o arquivo fla.
Obrigado.
#3 por Weverton Naves em Maio 9th, 2008
Olá Lucas.
Você pode baixar o aquivo no link que tem no post.
Abs.
#4 por Fabio Bucior em Maio 12th, 2008
Olá Weverton
Não tem o arquivo fla noa arquivo, se não for possível disponibilizá-lo, poderia deixar algumas dicas básicas para construir o listbox, e para listar os resultados?
Abs
#5 por Weverton Naves em Maio 12th, 2008
Fabio,
Pode baixar de novo, não tinha visto que faltou o .fla.
Abs.
#6 por Fabio Bucior em Maio 13th, 2008
Weverton, acho que deu bug no link…
abs
#7 por Weverton Naves em Maio 13th, 2008
Fabio, tente novamente.
Não sabia que o aDrive não substitui os arquivos, tenho que criar outro link.
Abs.
#8 por Fabio Bucior em Maio 13th, 2008
Caraca, pra te falar a verdade eu nem sabaia que existis esse tal DataGrid… tenho muito que aprender ainda, e esse seu material foi de boa ajuda, parabéns!!!
Também trabalho com webdesign, mas meu forte é html, php, bases de dados, não tenho tanta intimidade com flash.
Se precisar de algo que possa ajudá-lo, mande um e-mail.
Abraço,
#9 por Cassio em Agosto 13th, 2008
Weverton, blz cara eu to com um problemao num arquivo de conexão de php com flash, se puder da uma olhada e me da uma força cara :S
brigadao!
#10 por Weverton Naves em Agosto 15th, 2008
Cassio…
Desculpas, mas não estou com tempo hábil para resolver problemas.
Espero que compreenda.
Obrigado por ler o blog.
abs.
#11 por Thiago Laurentino em Setembro 25th, 2008
Oi Weverton.
Estou conseguindo desenrolar aqui um sistema parecido . Graças ao teu tutorial.
Como eu faço para que ao clicar em um item na lista ele abra um arquivo externo. Por exemplo uma imagem ou um arquivo de áudio, ou ainda um pdf, e execute esse arquivo.
Tem como?
Agradeço a ajuda.
#12 por Onebert em Outubro 14th, 2008
Cara, tem alguma maneira do resultado da pesquisa flash tambéms er um link?
#13 por Kelen em Outubro 30th, 2008
Oiiii
Onde ele coloca a base de dados criada?
T+
Kelen
#14 por Lima Junior em Outubro 31st, 2008
Caracas… muito bom cara o resultado!
Faz um tempinho que eu quebro a cabeça com busca em XML usando FLASH!
Estou produzindo um catálogo em DVD e estava exatamente com o problema da busca no xml!
Estou pensando como faria para adicionar mais campos?!
Valeu cara!! muito bom mesmo!
#15 por PauloJr em Dezembro 3rd, 2008
Olá Weverton,
Parabéns pelo trabalho. Há algum modo de fazer uma busca instantânea que destaque os itens à medida em que digitamos?
Obrigado.
#16 por menugeo em Março 5th, 2009
Como poner un comando “selectedIndex” para que abre la linea sececionada?
#17 por val em Setembro 8th, 2009
Weverton Naves
vc pode coloca o link pra baixa de novo cara
essa da versão 2.0
obrigado
#18 por Matheus em Outubro 12th, 2009
Cara você me salvou!!!
Obrigadão virei teu fã….
#19 por Lucas em Outubro 27th, 2009
Oi Weverton,
achei o máximo essa solução, porém tentei fazer o tutorial mais sou leigo no assunto e não consegui, tenho muitas fitas de vídeo e gostaria de usar esse modelo, você poderia me enviar o arquivo fla.
Obrigado.
#20 por Weverton Naves em Março 30th, 2009
Amigo, confira essa atualização:
http://wevertonn.wordpress.com/2009/03/30/busca-no-xml-v20/