Comunidad de diseño web y desarrollo en internet

Lector RSS en Flex 2 + XML en Actionscript 3

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 XD
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

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate