Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ddlightw

Carregar XML com XMLList

Recommended Posts

Estou tentando criar um slide com botão de voltar e avançar no flash, nos primeiros testes o texto carrega só um item do array no Textfield e no Output aparece a lista de itens, não consigo enxergar o erro:

Arquivo Flash

 

---------------------------------------------------------

 

var loader:URLLoader = new URLLoader();

loader.addEventListener(Event.COMPLETE, onLoaded);

 

var xml:XML;

 

function onLoaded(e:Event):void

{

 

xml = new XML(e.target.data);

 

var il:XMLList = xml.photo.attributes();//não sei se isso causou o erro

 

for(var i:uint=0; i < il.length(); i++)

{

 

lb_txt.text = il;// no trace retorna todos no campo só o último

 

ta.text = xml.photo.@caption; //dessa forma funciona, só que exibe sem espaços

}

}

 

loader.load(new URLRequest("arquivo.xml"));

 

========================================================================================

 

Arquivo xml

 

 

<?xml version="1.0" encoding="ISO-8859-1"?>

<slideshow>

<photo url="imagem1.jpg" caption="texto1." />

<photo url="imagem2.jpg" caption="texto2." />

<photo url="imagem3.jpg" caption="texto3." />

<photo url="imagem4.jpg" caption="texto4." />

<photo url="imagem5.jpg" caption="texto5." />

</slideshow>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Considerando o for, suponho que você esteja pensando que no caso do ta.txt as strings tenham sido adicionadas uma a uma a cada loop. Mas isso não aconteceu. Na verdade, xml.photo.@caption retorna um XML contendo apenas os valores do atributo caption. Quando você utiliza esse XML na propriedade text de um TextField, o Flash chama o método toString() implicitamente e retorna os valores assim, totalmente juntos, sem espaço. Não se pode esperar muito desse método, ele é só um método usado para "transformações forçadas".

 

Pode testar:

var xml:XML = <slideshow>
<photo url="imagem1.jpg" caption="texto1." />
<photo url="imagem2.jpg" caption="texto2." />
<photo url="imagem3.jpg" caption="texto3." />
<photo url="imagem4.jpg" caption="texto4." />
<photo url="imagem5.jpg" caption="texto5." />
</slideshow>;

ta.text = xml.photo.@caption;

No caso do método xml.photo.attributes(), você obtêm um objeto XMLList contendo os atributos url e caption e este também seria transformado em string ao ser definido à propriedade text, mas você não o faz. Apesar disso, você carrega o XMLList com uma chave (a variável i). Então pense no que acontece: No primeiro loop, estaria definindo text como "imagem1.jpg", no segundo "texto1.", no terceiro "imagem2.jpg", etc. Obviamente o Flash faz isso antes do recarregamento da visão e nós vemos apenas o último, "texto5.". Se quiser concatenar os resultados teria que usar o operador += (ou, para uma melhor performance, o método concat()) ao invés de só igual.

 

Chega de explicação. Veja se têm o resultado esperado da seguinte forma:

var xml:XML = <slideshow>
<photo url="imagem1.jpg" caption="texto1." />
<photo url="imagem2.jpg" caption="texto2." />
<photo url="imagem3.jpg" caption="texto3." />
<photo url="imagem4.jpg" caption="texto4." />
<photo url="imagem5.jpg" caption="texto5." />
</slideshow>;

var il:XMLList = xml.photo.attributes();

for (var i:uint; i < xml.photo.length(); i++) { // note que mudei a condição do loop, estava sendo o dobro do que provavelmente esperava
	lb_txt.text = lb_txt.text.concat(il[i], " ");
	ta.text = ta.text.concat(xml.photo[i].@caption, " ");
}

/* só pra remover o último espaço */
lb_txt.text = lb_txt.text.replace(/ $/, '');
ta.text = ta.text.replace(/ $/, '');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, post bem explicativo.

Eu estudo pela internet, já fiz cursos, mas nem tudo se aprende no básico o que é o caso do xml.

Peguei um exemplo em AS2 e tentei adaptar, funcionou, mas não sei se está correto fazer dessa forma:

 

var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onLoaded);

var xml:XML;
var i = 0;


function onLoaded(e:Event):void
{
	xml = new XML(e.target.data);
     
	var il:XMLList = xml.photo;
			
		for(var i:uint=0; i<il.length(); i++) {
       
          var legenda = il.@caption[0];
	  
	 var loadimg:Loader = new Loader();
         var path = il.@url[0];
	 loadimg.load(new URLRequest(path));
	 holder.addChild(loadimg);
	 legenda_txt.text = legenda;
      
     }//end for
}//end onLoaded

anterior.addEventListener( MouseEvent.CLICK, onclickprev,false, 0, true);
proximo.addEventListener( MouseEvent.CLICK,onclicknext, false, 0, true);

function onclickprev(e:MouseEvent) {
	
	var il:XMLList = xml.photo;

if(i > 0) {
   i--;
    var loadimg:Loader = new Loader();
    var path = il.@url[i];
    loadimg.load(new URLRequest(path));
	holder.addChild(loadimg);
    legenda_txt.text = il.@caption[i];
}
}

function onclicknext(e:MouseEvent) {
	
	var il:XMLList = xml.photo;

if(i < il.length()-1) {
   i++;
    var loadimg:Loader = new Loader();
    var path = il.@url[i];
    loadimg.load(new URLRequest(path));
	holder.addChild(loadimg);
   legenda_txt.text = il.@caption[i];

}
	}

loader.load(new URLRequest("arquivo.xml"));

 

agora eu vou ver como eu posso colocar uma tween ao mudar de imagem.

Minha dúvida é onde declarar as variáveis, declarei a il várias vezes e coloquei o loader em todas as funções para funcionar.

 

Agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi agora o porque do concat, eu andei lendo a documentação do flash sobre XML e tem uns exemplos interessantes, o problema é que é tudo no trace.

Tudo complica quando vai para parte de Display.

 

Tem um exemplo de livros que eu peguei do XMLList que não tava retornando nada, aí eu mudei as variáveis name e result e funcionou:

 

package {

import flash.display.Sprite;

 

public class XMLListExample extends Sprite {

private var books:XML;

 

public function XMLListExample() {

books = <books>

<book publisher="Addison-Wesley" name="Design Patterns" />

<book publisher="Addison-Wesley" name="The Pragmatic Programmer" />

<book publisher="Addison-Wesley" name="Test Driven Development" />

<book publisher="Addison-Wesley" name="Refactoring to Patterns" />

<book publisher="O'Reilly Media" name="The Cathedral & the Bazaar" />

<book publisher="O'Reilly Media" name="Unit Test Frameworks" />

</books>;

 

showBooksByPublisher("Addison-Wesley");

}

 

private function showBooksByPublisher(name:String):void {

var results:XMLList = books.book.(@publisher == name);

showList(results);

}

 

private function showList(list:XMLList):void {

var item:XML;

for each(item in list) {

trace("item: " + item.toXMLString());

}

}

}

}

 

Eu coloquei um Textfield e o concat que você falou.

 

listaxml_txt.text = listaxml_txt.text.concat(item.attribute("*").toXMLString(), " ");

 

Você falou "Não se pode esperar muito desse método, ele é só um método usado para "transformações forçadas".

Existe uma forma mais correta de exibir os dados num campo de texto?

Eu estou vendo os exemplos e testando, mas tem coisas como o concat que dificilmente eu iria chegar a essa conclusão.

 

Muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alterei o código para usar um objeto TextField ao invés da função trace().

package {
    import flash.text.TextField;
    import flash.display.Sprite;
    
    public class XMLListExample extends Sprite {
        private var books:XML;
        private var textField:TextField = new TextField();
        
        public function XMLListExample() {
            textField.width = stage.stageWidth;
            textField.height = stage.stageHeight;
            addChild(textField);
            
            books = <books>
            <book publisher="Addison-Wesley" name="Design Patterns" />
            <book publisher="Addison-Wesley" name="The Pragmatic Programmer" />
            <book publisher="Addison-Wesley" name="Test Driven Development" />
            <book publisher="Addison-Wesley" name="Refactoring to Patterns" />
            <book publisher="O'Reilly Media" name="The Cathedral & the Bazaar" />
            <book publisher="O'Reilly Media" name="Unit Test Frameworks" />
            </books>;
            
            showBooksByPublisher("Addison-Wesley");
        }
        
        private function showBooksByPublisher(publisher:String):void {
            var results:XMLList = books.book.(@publisher == publisher);
            showList(results);
        }
        
        private function showList(list:XMLList):void {
            var item:XML;
            for each(item in list) {
                //trace("item: " + item.toXMLString());
                textField.text = textField.text.concat(item.@publisher, '\t\t', item.@name, '\r');
            }
        }
    }
}

Quanto ao método toString(), acho que me expressei mal. Eu não quis dizer que se trata de um método "ruim", que deve ser evitado, mas, sim, que não se deve esperar, por exemplo, que ele adicione espaços ou que realize qualquer tipo de formatação sozinho. O método toString() é usado sempre que precisamos de uma representação escrita de um objeto. Pode ser chamado implícita ou explicitamente.

var array:Array = new Array(1, 2, 0xFF);
trace(array); // 1,2,255
trace(array.toString()); // 1,2,255

Note que o método toString() da classe Array retorna os dados separados por vírgula. O método de mesmo nome da classe XMLList retorna os dados sem nenhuma separação.

var xml:XML =
<testes>
	<teste id="1">a</teste>
	<teste id="2">b</teste>
	<teste id="3">c</teste>
</testes>;

trace(xml..teste.text()); // abc
trace(xml..teste.text().toString()); // abc

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.