Hoje em dia, diversos aplicativos usam XML: bancos de dados, navegadores web, clientes de e-mail, seu player de MP3 e até mesmo a sua agenda. Podemos citar também os diversos formatos que existem, tais como RSS, ATOM, SVG, WSDL, etc.
Para quem não conhece, XML (eXtensible Markup Language) é uma linguagem de marcação que tem uma sintaxe para criação de documentos estruturados, que podem ser lidos tanto por máquinas como por seres humanos. O principal objetivo do XML é criar uma maneira comum de descrever dados. Dessa forma, um programa A pode gravar seus dados em um documento XML, e um programa B pode ler esses dados sem problemas de compatibilidade entre ambos.
XML é independente de qualquer software particular, ou seja, podemos criar um XML no próprio bloco de notas, e ler os seus dados através de um aplicativo criado em Flash, PHP, ColdFusion, Python, Java, etc. Essa é uma das maiores vantagens do XML, você pode criar um documento com diversos dados, e ler esses dados através de diferentes aplicações. Um banco de dados por exemplo, pode gravar os dados armazenados nele em um documento XML para que outro banco de dados possa ler esses dados e armazená-los também.
Vamos ver então a cara desse tal XML:
-
<?xml version="1.0" encoding="utf-8"?>
-
<enderecos>
-
<dados>
-
<morador>José Fulano da Silva</morador>
-
<rua>Av. Dobra a Esquina</rua>
-
<numero>132</numero>
-
<bairro>Morro do Conde</bairro>
-
<cidade>Santa Maria da Prosperidade</cidade>
-
<pais>Candelábria</pais>
-
</dados>
-
<dados>
-
<morador>João Ciclano de Souza</morador>
-
<rua>Rua Tá em Casa</rua>
-
<numero>887</numero>
-
<bairro>Da Lapa</bairro>
-
<cidade>Springfield</cidade>
-
<pais>Alhures</pais>
-
</dados>
-
</enderecos>
Obs.: Procure sempre utilizar o encoding UTF-8, pois esse é o padrão de codificação do Flash, e assim evitamos problemas com acentos.
Veja que a estrutura do documento é uma árvore, podem existir diversas ramificações. Os nomes das tags não são padrões, ou seja, diferentemente do HTML, você mesmo pode definir o nome delas.
No exemplo, temos uma lista de endereços com 2 pessoas cadastradas. Nessa lista temos o nome da pessoa, o endereço onde habita e mais algumas informações. Agora, como acessamos esses dados a partir do Flash? É o que nós vamos ver agora.
O Flash tem uma classe específica para ler arquivos XML, a classe XML. A classe XML representa o documento XML no Flash, e contém métodos e eventos quase idênticos ao da classe LoadVars. Portanto, se você já trabalhou com a classe LoadVars, vai tirar de letra. Vamos a um pequeno exemplo, usando o documento XML acima. Também existe a classe XMLNode que representa cada elemento da hierarquia do XML.
Vamos pensar da seguinte forma:
- <enderecos> - Nó pai, é o nó que inicia a árvore do documento.
- <dados> - Nó filho de enderecos, é o primeiro filho.
- <morador> - Nó filho de dados, é o primeiro filho.
- <rua> - Nó filho de dados, é o segundo filho.
- <numero> - Terceiro nó filho.
- <bairro> - Quarto.
- <cidade> - Quinto.
- <pais> - Sexto e último nó filho.
</dados>
</enderecos>
Agora que vimos a hierarquia do documento XML, vamos ao Flash.
-
// Declarando o nosso objeto da classe XML
-
var oXML:XML = new XML();
-
/* Ignorando os espaços em branco do documento XML.
-
O que acontece é que quando escrevemos o documento,
-
nós formatamos ele com espaços, tabs, quebras de linha,
-
e isso interfere na leitura do documento.
-
Experimente depois, definir essa opção como false. */
-
oXML.ignoreWhite = true;
-
/* Evento onLoad. Quando o arquivo tiver sido carregado
-
completamente, esse evento é acionado. */
-
oXML.onLoad = function():Void{
-
trace(this);
-
}
-
// Carregando documento XML
-
oXML.load("enderecos.xml");
Resultado:<?xml version="1.0" encoding="utf-8"?><enderecos><dados><morador>José Fulano da Silva</morador><rua>Av. Dobra a Esquina</rua><numero>132</numero><bairro>Morro do Conde</bairro><cidade>Santa Maria da Prosperidade</cidade><pais>Candelábria</pais></dados><dados><morador>João Ciclano de Souza</morador><rua>Rua Tá em Casa</rua><numero>887</numero><bairro>Da Lapa</bairro><cidade>Springfield</cidade><pais>Alhures</pais></dados></end recos /></enderecos>
Bom, com isso sabemos que o XML está sendo lido. Mas, isso é simples demais. Vamos tentar ler o valor da tag morador da primeira tag dados. Lembra da pequena análise da estrutura que fizemos há pouco né? Pois bem, ela é a base para o que vamos fazer.
-
// Declarando o nosso objeto da classe XML
-
var oXML:XML = new XML();
-
/* Ignorando os espaços em branco do documento XML.
-
O que acontece é que quando escrevemos o documento,
-
nós formatamos ele com espaços, tabs, quebras de linha,
-
e isso interfere na leitura do documento.
-
Experimente depois, definir essa opção como false. */
-
oXML.ignoreWhite = true;
-
/* Evento onLoad. Quando o arquivo tiver sido carregado
-
completamente, esse evento é acionado. */
-
oXML.onLoad = function():Void{
-
/* Exibindo o valor do nó morador do primeiro nó dados.
-
XML = this
-
<enderecos> = firstChild ou childNodes[0], mas como só existe
-
1 nó pai, usamos firstChild mesmo.
-
<dados> = childNodes[0] ou firstChild. Usamos childNodes[0]
-
porque temos o childNodes[1], e podemos querer acessá-lo em breve.
-
<morador> = childNodes[0].
-
Valor do nó = childNodes.
-
*/
-
trace(this.firstChild.childNodes[0].childNodes[0].childNodes);
-
}
-
// Carregando documento XML
-
oXML.load("enderecos.xml");
Resultado: José Fulano da Silva
Opa, funcionou! this é o objeto XML, firstChild é o primeiro nó do XML, ou seja, o nó enderecos. Vamos usar nosso esquema anterior novamente para clarear as idéias
- <enderecos> - firstChild - Nó pai, é o nó que inicia a árvore do documento.
- <dados> - childNodes[0] - Nó filho de enderecos, é o primeiro filho.
- <morador> - childNodes[0] - Nó filho de dados, é o primeiro filho.
- <rua> - childNodes[1] - Nó filho de dados, é o segundo filho.
- <numero> - childNodes[2] - Terceiro nó filho.
- <bairro> - childNodes[3] - Quarto.
- <cidade> - childNodes[4] - Quinto.
- <pais> - childNodes[5] - Sexto e último nó filho.
</dados>
</enderecos>
Isso que dizer, que se desejarmos mostrar o valor da rua ao invés do morador, bastaria mudar o valor do segundo childNodes[0] para childNodes[1]. Lembre-se que temos 2 nós dados, portanto, se mudarmos o valor do primeiro childNodes[0] para childNodes[1] o resultado será João Ciclano de Souza. Entendeu? É só seguir a hierarquia do documento, mais simples que isso não tem.
Então, que tal mostrarmos os dados do nosso XML em um campo de texto?
-
// Declarando o nosso objeto da classe XML
-
var oXML:XML = new XML();
-
// Ignorando espaços
-
oXML.ignoreWhite = true;
-
// Evento onLoad
-
oXML.onLoad = function():Void{
-
// Objeto TextField. Nosso campo de texto.
-
var cptexto:TextField = _root.createTextField("dados_txt", 1, 0, 0, 300, 300);
-
/* Objeto XMLNode (é outra classe sim, mas vamos fingir que não).
-
Uma referência ao root ou nó pai, só para simplificar o acesso a esse nó,
-
ao invés de escrever this.firstChild toda vez que quisermos acessá-lo. */
-
var rootNode:XMLNode = this.firstChild;
-
/* Loop. Vou ser breve nessa parte, até porque o assunto é XML.
-
Pegamos o valor total de nós contidos em rootNode. Perceba que
-
temos um childNodes ali. Para não confundir sua cabeça, vamos imaginar o seguinte:
-
Em rootNode, você vê o nó <enderecos> mas não enxerga dentro dele.
-
Já em rootNode.childNodes, tu enxerga os nós filhos dele, inclusive quantos são.
-
Portanto rootNode.childNodes.length nos diz quantos filhos esse nó tem.
-
Então, para cada i menor que o número de nós filhos, o FOR executa o bloco de código. */
-
for(var i = 0; i < rootNode.childNodes.length; i++){
-
/* Objeto XMLNode. Mesma coisa que o anterior.
-
Temos 2 nós <dados>, ou seja esse bloco vai ser executado 2 vezes, uma para cada nó.*/
-
var nodeDados:XMLNode = rootNode.childNodes[i];
-
// For denovo, desta vez para o filhos de <dados>
-
for(var n = 0; n < nodeDados.childNodes.length; n++){
-
/* Aqui eu preferi separar em 2 variáveis. Uma contém o valor do nó,
-
o que tem dentro dele, no caso, texto.
-
A outra contém o nome do nó, o nome da tag.*/
-
var nodeValue:String = nodeDados.childNodes[n].childNodes;
-
var nodeName:String = nodeDados.childNodes[n].nodeName;
-
/* Adicionamos os valores no campo de texto, dei um uppercase no nodeName pra
-
ficar bunitinho.*/
-
cptexto.text += nodeName.toUpperCase() + ": " + nodeValue + "\n";
-
}
-
// Adicionamos uma quebra de linha para separar os valores de cada nó <dados>
-
cptexto.text += "\n";
-
}
-
}
-
// Carregando documento XML
-
oXML.load("enderecos.xml");
Resultado: MORADOR: José Fulano da Silva
RUA: Av. Dobra a Esquina
NUMERO: 132
BAIRRO: Morro do Conde
CIDADE: Santa Maria da Prosperidade
PAIS: Candelábria
MORADOR: João Ciclano de Souza
RUA: Rua Tá em Casa
NUMERO: 887
BAIRRO: Da Lapa
CIDADE: Springfield
PAIS: Alhures
Acho que deu para termos uma noção de como trabalhar com dados vindos de um XML certo? Esse artigo é apenas uma introdução, algo bem simples para que você compreenda o funcionamento da interação Flash com o XML. Existem ainda diversos métodos que eu pretendo abordar nas próximas partes desse artigo. Pratique bastante, altere o código, enfim, tente!
Fique à vontade para deixar seus comentários (sugestões, críticas, etc) a respeito dessa matéria, e caso tenha dúvidas, por favor direcione-se à nossa lista que eu e o pessoal ajudaremos com muito prazer.
Ficamos por aqui, em breve estarei escrevendo a próxima parte deste artigo, onde eu detalharei melhor os métodos da classe.
Abraços.
Comentários
Adicionar CSS
Mozart bom dia! gostiei muito do seu tutorial e estou usando como base para vários projetos meus aqui ... e uma coisa ta dando problema.... como fica a action desse exemplo q vc passou no tutorial com o segunte formatação CSS
Morador em negrito e letras em vermelho
País em negrito e letra na cor preta
morador {
color: #CC3300;
font: Arial;
font-size: 12px;
font-weight: bold;
}
pais {
color: #333333;
font: Arial;
font-weight: bold;
font-size: 11px;
}
Estou tentando resolver essa incógnita ... mas esta dificil ... não tenho muita experi em action ....
(tousando flash cs3 com a opção actionscript 1.0 2.0)
Se você puder ajudar agradeço.
meu msn: biolofgos@hotmail.com
Fabiano
Parabéns.
Muito bom o tutorial, entendia muito pouco do XML agora deu uma esclarecida muito boa...
um dos melhores tutoriais que eu ja li.