Comunidad de diseño web y desarrollo en internet online

Carga de datos desde y hacia XML

Citar            
MensajeEscrito el 02 Ago 2010 09:23 pm
Buenas.

A pesar de que hay mucha documentación al respecto, manejar XML con ActionScript es como un mundo aparte para mi.
A veces juraría que hago las cosas tal y como lo pone en los ejemplos que leo y aún así no me funcionan :lol: . Todo ello por copiar las cosas sin saber, claro ^^

En mi caso concreto, tengo un documento de este estilo:

Código XML :

<HighScores>
   <Score id = '1'>
      <nombre>juan</nombre>
      <puntos>50</puntos>
   </Score>

   <Score id = '2'>
      <nombre>paco</nombre>
      <puntos>45</puntos>
   </Score>

   <Score id = '3'>
      <nombre>pepe</nombre>
      <puntos>30</puntos>
   </Score>

   <Score id = '4'>
      <nombre>luis</nombre>
      <puntos>20</puntos>
   </Score>

   <Score id = '5'>
      <nombre>samuel</nombre>
      <puntos>0</puntos>
   </Score>
</HighScores>



Vale. Lo que intento es coger esa información y ponerla en un TextField que muestro por pantalla.

Código ActionScript :

public function cargarXML(url:String){
         cargador.addEventListener(Event.COMPLETE, cargaCompleta);
         //loadUrl.addEventListener (SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
         //loadUrl.addEventListener (HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
         //loadUrl.addEventListener (IOErrorEvent.IO_ERROR, ioErrorHandler)
         cargador.load(new URLRequest(url));
      }


La carga me funciona correctamente, creo, y llegamos a la función cargaCompleta. He ahí el problema

Código ActionScript :

private function cargaCompleta(e:Event):void {      //Funcion que se ejecuta cuando termina la carga.

         var docCargado: XML = new XML(e.target.data);
         docCargado.ignoreWhite = true;
         textoRecords.text += trace(docCargado);
         var miRaiz = docCargado.child(HighScores);
         //trace(docCargado);
         //trace(docCargado.toXMLString);
         //trace(docCargado.child);
         //trace(miRaiz);
         //trace(miRaiz.toXMLString + " y miRaiz");
              //docCargado.parseXML(e.target.data);
         //trace (miRaiz.length);
         //for each(var nodo:XML in miRaiz.childNodes){
         for each(var nodo:XML in miRaiz.child){
            //Devuelve el atributo puntuacion
            textoRecords.text += "\n#1: " + nodo.nombre;
            trace (nodo.@id);
         }
      }


Pues bien, no pinta más que un "undefined" en pantalla y el documento XML, tal cual, en la salida estándar, en función de qué lineas de trace habilite. Alguna idea? No tengo ni idea, por ejemplo de qué hace el "parse".

Muchas gracias de antemano.

Por Cher0

18 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Ago 2010 11:10 pm
Hola, yo estuve probando un metodo rapido que siempre utilizo, ya que no entendi algunas cosas de las que tenias. Y ahora no tengo tiempo de revisaro bien, por ahora esto te puede servir, estoy seguro que debe haber alguna forma mas optima.

Código ActionScript :


cargarXML("datos.xml");

function cargarXML(url:String) {
    var cargador:URLLoader = new URLLoader();
    cargador.load(new URLRequest(url));
    cargador.addEventListener(Event.COMPLETE, cargaCompleta);
}

function cargaCompleta(e:Event):void {//Funcion que se ejecuta cuando termina la carga.
    var docCargado:XML=new XML(e.target.data);
    var UsuAttrib:XMLList=docCargado.elements();
    if (UsuAttrib!=null) {
        for each (var attrib:XML in UsuAttrib) {
            //trace ("attrib.elements()________ "+attrib.elements());
            var scoreAttrib:XMLList=attrib.elements();
            if (scoreAttrib!=null) {
                for each (var score:XML in scoreAttrib) {
                    if (score.name()=="nombre") {
                        var nombre:String = score;
                    }
                    if (score.name()=="puntos") {
                        var puntos:String = score;
                        trace("Datos: "+nombre+" "+score);
                    }
                }
            }
        }
    }
}

Por fats2005

6 de clabLevel



 

Ingeniero en Multimedia

firefox
Citar            
MensajeEscrito el 03 Ago 2010 05:49 am
BuenAS:
Cambia el código

Código :

         for each(var nodo:XML in miRaiz.child){
            //Devuelve el atributo puntuacion
            textoRecords.text += "\n#1: " + nodo.nombre;
            trace (nodo.@id);
         }

por este otro

Código :

     for each(var nodo:XML in docCargado.child("Score")){
          textoRecords.text += "\n#1: " + nodo.nombre;
          trace (nodo.@id);
     };


Puedes escribir docCargado.child("Score") (que obtiene todos los hijos llamados "Score"), directametne recurrir a la nomenclatura de punto y escribir docCargado.Score

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 03 Ago 2010 09:46 am
Muchas gracias a los dos.

En concreto, Lukánicos, gracias otra vez :lol:

Créeme si te digo que ya probé esto:

Código ActionScript :

for each(var nodo:XML in docCargado.child("Score")){
          textoRecords.text += "\n#1: " + nodo.nombre;
          trace (nodo.@id);
     };


Pero sin las comillas de .child("Score"). xD qué metedura de pata... Con ellas funciona de lujo.

Fats2005, gracias a ti también. Creo que el método child es más eficiente que elements, ya que accedes directamente al grupo de nodos que quieres. De todas formas, tu forma debería también dar resultado.

Por Cher0

18 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Ago 2010 09:49 am
Y ahora quizá podamos aprender un poco... para qué sirven toXMLString y parseXML? En algunos tutoriales de acceso y recuperación de datos desde XML los usan bastante, y la verdad es que o no los comprendo, o no me funcionan.

Por Cher0

18 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Ago 2010 10:23 am
BuenAS:

toXMLString te devuelve una cadena de texto con el xml. Imagino que la duda viene de por qué existe si ya tenemos toString(). Y es que para nodos simples toString() no devuelve las etiquetas, y utilizar toXMLString te garantiza que vas a obtener una cadena con todas las etiquetas.

Con respecto a parseXML, ten cuidado con el paquete flash.xml que aparece en AS3 y que representa la migración de las clases XML de AS2. Si vas a programar en AS3 de cero, no deberías tener que recurrir a dicho paquete. Utiliza directamente la clase XML con sus métodos y propiedades.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 03 Ago 2010 01:02 pm
Pues no era tan complicado vaya xD.

Ok, me olvido del parse. Sin embargo, pongamos la situación de mi documento XML:

<HighScores>
<Score id = '1'>
<nombre>juan</nombre>
<puntos>50</puntos>
</Score>

<Score id = '2'>
<nombre>paco</nombre>
<puntos>45</puntos>
</Score>

...

</HighScores

Al usar toXMLString te escribe lo que es eso mismo, pero toString? No me funciona aplicado a docCargado. Te imprimiría el XML en formato tabla? o cómo?

id = 1
juan
50

id = 2
paco
45

etc?

Por Cher0

18 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Ago 2010 01:41 pm
BuenAS:

Hasta que no te haga falta, seguro que no le ves utilidad :)

Trabajando con AS3 casi seguro que no la emplearás. Ahora bien, imagina que ese xml cargado lo quieres pasar a una función javascript del navegador a través de ExternalInterface, o a una función php que esté en un servidor, o guardarlo en una base de datos; aquí si es útil toXMLString, ya que devuelve el xml en texto plano perfectamente formado.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 03 Ago 2010 11:15 pm
Ajam. Muchas gracias de nuevo.

Ya le encontraré utilidad cuando lo necesite :D

Por Cher0

18 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.