Saltar para o conteúdo

ActionScript/Usando XML com ActionScript

Origem: Wikilivros, livros abertos por um mundo aberto.

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);

Carregando XML

[editar | editar código-fonte]

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>

Leitura de nó de elemento

[editar | editar código-fonte]

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.

Leitura de nós de texto

[editar | editar código-fonte]

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).

Usando XMLList

[editar | editar código-fonte]

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

Leitura de atributos

[editar | editar código-fonte]

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).

Utilizando operadores mais específicos

[editar | editar código-fonte]
  • 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.

Usando condicionais

[editar | editar código-fonte]

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.

Inserindo e apagando

[editar | editar código-fonte]