ActionScript/Usando XML com ActionScript
Criando XML
editarHá 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
editarCrie 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
editarA 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
editarChame 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
editarVamos 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
editarUtilize 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- 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
editarPodemos 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.