Busca no XML


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

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.

searchxml.gif

Código do primeiro frame:

//cria variáveis
var 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();

Código do segundo frame

//importando classes
import 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();

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. #1 por Alejandro em Março 10th, 2008

    good job

  2. #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. #3 por Weverton Naves em Maio 9th, 2008

    Olá Lucas.

    Você pode baixar o aquivo no link que tem no post.
    Abs.

  4. #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. #5 por Weverton Naves em Maio 12th, 2008

    Fabio,

    Pode baixar de novo, não tinha visto que faltou o .fla.
    Abs.

  6. #6 por Fabio Bucior em Maio 13th, 2008

    Weverton, acho que deu bug no link…
    abs

  7. #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. #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. #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. #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. #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. #12 por Onebert em Outubro 14th, 2008

    Cara, tem alguma maneira do resultado da pesquisa flash tambéms er um link?

  13. #13 por Kelen em Outubro 30th, 2008

    Oiiii

    Onde ele coloca a base de dados criada?

    T+
    Kelen

  14. #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. #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. #16 por menugeo em Março 5th, 2009

    Como poner un comando “selectedIndex” para que abre la linea sececionada?

  17. #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. #18 por Matheus em Outubro 12th, 2009

    Cara você me salvou!!!
    Obrigadão virei teu fã….

  19. #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. #20 por Weverton Naves em Março 30th, 2009

(não será publicado)