Cristalab

Lector RSS en Flex 2 + XML en Actionscript 3

Por: Zah + 06.11.2006

Hay otras maneras de hacer esto, como usando ArrayCollation, sólo que quería hacer este post sobre lo fácil que es manejar contenido XML en Actionscript 3 (y el gran contraste en ese aspecto con manejar XML en Actionscript 2).

Para este artículo usaremos Flex Builder 2, disponible para descargar de la web de Adobe.

Bien, en AS3 existen las clases XMLDocument y XMLNode, que permiten trabajar con el XML como en AS2, pero no deberían usarse para nada. En su lugar se usa la clase XML.

Para convertir una cadena, objeto o cualquier otra cosa posible en XML, usamos la función global XML(expresión ).

Aquí viene lo bonito: si tenemos el xml de un rss, por ejemplo, http://www.cristalab.com/rss.php el XML se trabaja automáticamente como un Array de Objets, de tal manera que para referirnos a digamos el primer elemento será simplemente elXML.channel.item[0], sin tener que estar jugando con los condenados firstChild y ChildNodes. Pero lo mejor es que podemos usar un condicional en la propia referencia, y que se seleccionen sólo aquellos elementos para los que el condicional devuelve true. Me explico: Si queremos seleccionar todos los elementos del feed de clab cuyo título empiece por "C" el código sería simplemente:

Código :

elXml.channel.item.(title.substr(0,1)=="C")

También podemos hacer que busque si está una cadena específica, con lo que ya tendríamos creado un filtro:

Código :

elXml.channel.item.(title.substr(0,1)=="C")

Código :

clabRss.channel.item.(title.indexOf(evt.target.text)!=-1)

Dicho esto, les presento este [uu]chapucero, horrible[/uu] inacabado RSSReader en flex:

Código :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" initialize="init();">
   <mx:Script>
      <![CDATA[
      public var clabRss:XML
         public function init():void{
            var req:URLRequest=new URLRequest("http://www.cristalab.com/rss.php");
            var xmlLoader:URLLoader=new URLLoader();
            xmlLoader.load(req);
            xmlLoader.addEventListener(Event.COMPLETE,onLoadComplete)
         }
         public function onLoadComplete(event:Event):void{
               clabRss=XML(event.target.data);
               main.title=clabRss.channel.title
               posts.labelField="title";
               posts.dataProvider=clabRss.channel.item;
               posts.selectedIndex=0;
               titleTxt.text=clabRss.channel.item[0].title
               description.text=clabRss.channel.item[0].description;
         }
         public function filter(evt:Event):void{
            if(evt.target.text==""){
               posts.dataProvider=clabRss.channel.item;
            }else{
   
               posts.dataProvider=clabRss.channel.item.(title.indexOf(evt.target.text)!=-1)
            }
         }
         
      ]]>
   </mx:Script>
   <mx:Panel id="main" width="100%" height="100%" layout="absolute">
      <mx:Text y="10" text="Cargando..." fontWeight="bold" fontSize="36" id="titleTxt" height="168" left="10" right="10"/>
      <mx:TextArea right="20" left="10" id="description" wordWrap="true" editable="false" bottom="75" top="150"/>
      <mx:Button x="10" label="Copy Link" bottom="25" toolTip="{posts.selectedItem.link}" click="{System.setClipboard(posts.selectedItem.link)}"/>
   </mx:Panel>
   <mx:VBox height="100%">
   <mx:Label text="Filtrar:" fontWeight="bold"/>
   <mx:TextInput id="searchBox" width="100%" change="filter(event)"/>
   <mx:List height="100%" id="posts" width="300" change="{titleTxt.text=posts.selectedItem.title;description.text=posts.selectedItem.description;}"></mx:List>
   </mx:VBox>
</mx:Application>

A grandes rasgos, lo que hace es cargar el rss de clab mediante un URLRequest y un URLLoader, muestra los títulos en el List y al seleccionarlos allí van cambiando las demás propiedades. Además tiene un botón para copiar la ruta al portapapeles... porque me aburría Riendo
Nota: Debido a problemas con mi servidor no puedo subir ahora el archivo final. De todas formas, siempre pueden copiar el código y pegarlo en el Flex online compiler

Etiquetas flex actionscript_3

Comentarios | Enviar un comentario
Muy bueno Zah Thumbs up
por fin un Tip de Flex en Clab Guiño
Por: Zguillez
Update: Entiendo lo que hiciste al explicar el manejo de XML, hay tambien que aclara que hay formas más faciles.

Es un buen tuto para explicar el nuevo objeto XML, pero eso tambien puede hacerse con HTTPService sin tanto código.

De hecho, sin código. Haré un tip de ello.
Por: Freddie
According to the old writings, the coming of flex arrived.

Arrepentíos pecadores U_U


Buen tip Zah Sonrisa
Por: MorphX
De hecho tiene razon F, mi tuto esta basado en la misma descripcion que uso Zah y tiempo despues me di cuenta de eso, la ventaja que existe con la codificacion de Zah es el uso de animaciones entre cada carga.
Por: Atse_blog

Freddie® :

Es un buen tuto para explicar el nuevo objeto XML, pero eso tambien puede hacerse con HTTPService sin tanto código.

De hecho, sin código. Haré un tip de ello.


Me parece que voy a meter la pata con lo que voy a decir, corregidme si me equivoco, pero para hacerlo con un HTTPService tienes que programar un backend en php, como hiciste tú en la conferencia, es decir el código que no pones en flash lo pones en un lenguaje de servidor, incluyendo la necesidad de este, además ¿cómo se haría con un rss?

De todas formas, el lector rss no era más que el primer ejemplo práctico que se me ocurrió...
Por: Zah
No Hace falta lenguaje de lado de Servidor para usar HTTPService. Es más el ejmplo del lector de RSS que viene en la documentación de flex, esta hecho solo con HTTPService y uno que otro metodo. Pero Bastante simple en realidad
Por: shogoki
En el ejemplo de freddie en la conferencia, usaba el backend para flash, y demostraba lo dificil que era hacer una aplicación en flash... para luego hacer lo mismo usando el HTTPService en flex... y demostrar que Flex era superior en ese sentido...

miau
Por: jos_blog
No JOS, Freddie usó un código php para generar el webservice que luego usaría con FLEX, lo que no hizo fue crear una clase en php entera definiendo propiedades y métodos, pero el código que usó para flex se puede aprovechar casi igual con un objeto XML de flash (aunque con algo más de código). Concretamente este código es el que usó:

Código :

<?php
   function plugClab($consulta){
      //Parámetros de la db
      $db="estudiantes";
      $user="root";
      $pass="";
      $server="localhost";
      //Conexion
      $dbh=mysql_connect($server,$user,$pass) or die ("I cannot open the database because: " . mysql_error());
      mysql_select_db($db);
      $resultado=mysql_query($consulta,$dbh);
      mysql_close($dbh);
      return $resultado;
   }
   $sql = "SELECT * FROM calificaciones WHERE nombre LIKE '".$_GET["nombre"]."'";
   $id=plugClab($sql);
   
   $c=0;
   while($calif[$c]=mysql_fetch_assoc($id)){
      $c++;
   }
   mysql_free_result($id);
   header('Content-type: text/xml; charset=utf-8');
?>
<?php echo "<?";?>
xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
  <calificaciones total="<?php echo ($c); ?>">
    <?php
for ($i=0;$i<$c;$i++){
?>
    <estudiante id= "<?php echo $calif[$i]["id"]; ?>" nombre="<?php echo $calif[$i]["nombre"]; ?>" email="<?php echo $calif[$i]["email"]; ?>" calificacion="<?php echo $calif[$i]["calificacion"]; ?>" />
    <?php
}
?>
  </calificaciones>
</rsp>

Por: Zah
naaa, es una de las primeras lecciones de la ayuda de flex

saludos
Por: Maikel

Maikel :

naaa, es una de las primeras lecciones de la ayuda de flex

saludos


Exacto, el código seria algo así:

Código :


   <mx:HTTPService
      id="feedRequest"
      url="http://weblogs.macromedia.com/mchotin/index.xml"
      useProxy="false"/>


Ya después si queremos acceder a los elementos del XML, basta con utilizar la propiedad lastResult. Por ejemplo si queremos el titulo de un feed escribimos:

Código :

feedRequest.lastResult.rss.channel.title


donde rss, channel y title son nodos del documento xml cargado.
Por: shogoki
Yo hasta ahora solo he podido meterle un css a Flex XDXDXD, si es que hay que ser triste. Ya me pondré en serio a estudiar Flex, gracias por este trocito de sabiduría Muy Feliz
Por: D3N14M_blog
Por cierto, intenté copiar todo el código en el Flex Online Compiler y me largo esto:

Código :

Error #2044: securityError no controlado: text=Error #2048: Violación de la seguridad Sandbox: http://try.flex.org/output/fBF704044E081438F300596AD7ADFED5D.swf no puede cargar datos desde http://www.cristalab.com/rss.php.
   at App/init()
   at App/___Application1_initialize()
   at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
   at flash.events::EventDispatcher/dispatchEvent()
   at mx.core::UIComponent/dispatchEvent()
   at mx.core::UIComponent/set processedDescriptors()
   at mx.core::Container/createComponentsFromDescriptors()
   at mx.core::Container/mx.core:Container::createChildren()
   at mx.core::UIComponent/initialize()
   at mx.core::Container/initialize()
   at mx.core::Application/initialize()
   at App/initialize()
   at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::childAdded()
   at mx.managers::SystemManager/::initializeTopLevelWindow()
   at mx.managers::SystemManager/::docFrameHandler()


Alguna idea de que puede ser? Porque me suena al legendario error de los permisos de acceso de Flash, pero no se.Lengua
Por: D3N14M_blog

D3N14M_blog :

Alguna idea de que puede ser? Porque me suena al legendario error de los permisos de acceso de Flash, pero no se.Lengua
Pues es eso precisamente. No puedes cargar contenido dentro de Flex a URLs externas al dominio donde se ejecuta el swf. En el Flex Online puedes probar como se vería, pero sólo en local podrás ver su funcionamiento.
Por: Freddie
Sí, en el error te da la URL del swf y ese puedes guardarlo en el disco y ejecutarlo desde allí.
Por: Zah
Probé el código y me da el siguiente error:

'main': identifier and class may not have the same name.

en la línea 32
Por: Ruben Rojas_blog
El ejemplo de carga de rss que viene con el tutorial de flex es muy ilustrativo, el problema viene, que es lo que me ha pasado a mi, cuando quieres cargar un rss de otro dominio que no te tengan incluido en el crossdomain.xml ,a hi se complica el asunto, y ya hay que tirar de php, o lo que cada uno use. Igualmente creo que con el actionscript 3 se pueden programar operaciones mas complejas de gestion de datos con ficheros xml.
O eso creo por el momento. Un saludo.
Por: juanan_blog
Porfabor podrian ser un poco más ordenados casi no puedo entender sin ofender porfabor
Por: Carolina_blog
quisiera ver un ejepmplo funcionandoo =$
Por: Loon
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.