ActionScript/Usando XML com ActionScript
Índice |
[editar] Criando XML
Há duas formas de se criar um objeto XML no ActionScript. Uma é criar o objeto XML e digitar os nós diretamente no objeto.
var pessoas:XML = <grupo> <pessoa>Francisco</pessoa> <pessoa>Rodrigo</pessoa> <pessoa>Vitor</pessoa> </grupo>;
Outra é criar um objeto String que abrigará oXML em formato texto, e depois passá-lo para um objeto XML.
var texto:String = "<grupo><pessoa>Francisco</pessoa></grupo>"; var xml:XML = new XML(texto);
[editar] Carregando XML
Crie um objeto da classe URLLoader. Ele é incumbido de carregar dados externos. Depois passaremos o conteúdo do carregamento para um objetoXML.
var carregador:URLLoader = new URLLoader(); // Quando o carregamento estiver completo, chama a função emCompleto carregador.addEventListener(Event.COMPLETE, emCompleto, false, 0, true); // O objeto URLRequest serve para abrigar uma requisição de URL carregador.load(new URLRequest("http://localhost/arquivo.xml")); function emCompleto(evt:Event):void { var dadosXML:XML = new XML(evt.target.data); // Criação do dadosXML, onde está o conteúdo do carregemento trace(dadosXML); }
O evt.target se refere ao carregador (que é um objeto URLLoader), e a sua propriedade data contém o arquivo XML de "http://localhost/arquivo.xml". Quando completo, ele irá exibir a sua árvore XML.
O nosso arquivo.xml seria algo do tipo:
<?xml version="1.0" encoding="utf-8" ?> <data> <pessoa id="cliente">Francisco</pessoa> <pessoa id="cliente">Rodrigo</pessoa> <pessoa id="nao-cliente">Vitor</pessoa> </data>
[editar] Leitura de nó de elemento
A leitura de elementos se dá pela chamada do nó em um objeto XML. Adaptando o exemplo anterior:
var carregador:URLLoader = new URLLoader(); carregador.addEventListener(Event.COMPLETE, emCompleto, false, 0, true); carregador.load(new URLRequest("http://localhost/arquivo.xml")); function emCompleto(evt:Event):void { var dadosXML:XML = new XML(evt.target.data); trace(dadosXML.pessoa); // Exibirá os três nós "pessoa" de arquivo.xml }
Usamos dadosXML.pessoa para chamar os nós pessoa do XML. Ele irá exibir os nós junto com o texto.
[editar] Leitura de nós de texto
Chame a função text() do nó de elemento para exibir o texto. Ele irá exibir todos os texto se chamado sem um índice.
var carregador:URLLoader = new URLLoader(); carregador.addEventListener(Event.COMPLETE, emCompleto, false, 0, true); carregador.load(new URLRequest("http://localhost/arquivo.xml")); function emCompleto(evt:Event):void { var dadosXML:XML = new XML(evt.target.data); trace(dadosXML.pessoa.text()); // Exibirá os três nós "pessoa" de arquivo.xml }
Por ele trabalhar como uma lista você pode colocar um número de índice para chamar um item específico (por exemplo, dadosXML.pessoa.text()[0] para o primeiro nome).
[editar] Usando XMLList
Vamos adaptar novamente o exemplo anterior. Agora, iremos criar um objeto XMLList, que tratará de transformar um XML em uma Array (lista) de itens.
var carregador:URLLoader = new URLLoader(); carregador.addEventListener(Event.COMPLETE, emCompleto, false, 0, true); carregador.load(new URLRequest("http://localhost/arquivo.xml")); function emCompleto(evt:Event):void { var dadosXML:XML = new XML(evt.target.data); // Criando a lista com o texto do primeiro nó "pessoa" do XML... var lista:XMLList = dadosXML.pessoa[0].text(); trace(lista); // Exibirá "Francisco" }
Você pode iterar esta Array, obter informações, entre outras.
var lista:XMLList = dadosXML.pessoa; trace(lista.length()); // Exibe 3
[editar] Leitura de atributos
Utilize o arroba (@) quando quiser obter o valor do atributo de um nó. Usando o XML arquivo.xml (mostrado anteriormente), iremos pegar o primeiro nó, que tem como valor cliente no atributo id.
var carregador:URLLoader = new URLLoader(); carregador.addEventListener(Event.COMPLETE, emCompleto, false, 0, true); carregador.load(new URLRequest("http://localhost/arquivo.xml")); function emCompleto(evt:Event):void { var dadosXML:XML = new XML(evt.target.data); // Obtendo valor do atributo... texto = dadosXML.pessoa[0].@id; trace(texto); // Exibirá "cliente" }
A linha dadosXML.pessoa[0].@id puxa o valor do atributo id do nó 0.
Se o nome do atributo contiver hífen, você pode utilizar o método attribute() no lugar de arroba.
texto = dadosXML.pessoa[2].attribute("nao-cliente");
Você pode usar este método tanto para atributos com hífens como normais (ao contrário de arroba, mais limitado).
[editar] Utilizando operadores mais específicos
- Operador Asterisco (*)
Você pode colher os texto de nós com o mesmo nome, porém em locais diferentes, utilizando o operador asterisco (*).
var doc:XML = <data> <tipo> <titulo>Lista geral</titulo> <responsavel><pessoa>Marcos</pessoa></responsavel> </tipo> <grupo> <titulo>Grupo de clientes</titulo> <pessoa>Francisco</pessoa> <pessoa>José</pessoa> <pessoa>Pedro</pessoa> </grupo> </data>; trace(doc.*.titulo.text()); // Exibe Lista geral e Grupo de clientes
No caso acima, a linha doc.*.titulo.text() irá pegar do XML doc todos (*) os textos de tags título (titulo.text()). Veja outra maneira de uso, utilizando um número de índice:
trace(doc.*.titulo[0].text());
Nesse caso, será exibido apenas "Lista geral".
- Operador Descendente (..)
Outro operador que pode ser usado é descendente (..), que é muito semelhante: irá procurar dentro de qualquer nó especificado. Veja o snippet abaixo.
trace(doc..pessoa.text());
Neste caso, ele irá exibir Marcos, Francisco, José e Pedro. Ele irá procurar dentro do XML doc pelo texto das tags pessoa (..pessoa.text()) seja onde estiver: dentro de titulo, de responsavel, de grupo, ou outro qualquer.
[editar] Usando condicionais
Podemos utilizar condicionais para buscar um determinado elemento dentro do XML. Veja o snippet:
var doc:XML = <raiz> <pessoa estado='SP'>Francisco</pessoa> <pessoa estado='RJ'>José</pessoa> <pessoa estado='RJ'>João</pessoa> </raiz>; trace(doc.pessoa.(@estado == "SP")); // Exibe Francisco
O comando trace() acima irá exibir somente o conteúdo de nós pessoa cujo atributo estado seja igual a SP (pois @estado == "SP"). Repare que antes do parêntese é inserido um ponto.