Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASS RSS2PARSER (LECTEUR DE FLUX RSS 2.0)


Information sur la source

Catégorie :MX2004: CLASS Niveau : Initié Date de création : 29/04/2004 Date de mise à jour : 13/07/2004 22:37:23 Vu : 5 798

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note


Description

hello voici une class qui permet d'analyser un flux rss 2.0
Elle ne charge pas le flux, vous devez lui fournir un object XML lors de l'initialisation.
  
var x:XML = new XML();
x.ignoreWhites = true;
x.load("http://fluxrss2");
x.onLoad = function() {
    var rss2 = new rss2Parser(x);
}
  
La methode rssInfo() retourn un objet {title, link, description} qui decrit le flux rss.

la methode parse() permet de parser le fichier, et de stoquer les infos dans un array. la methode retourne true quand elle a fini.

la methode getValue() permet de recuperer l'array créé par parse().
Chaque item de cet array est un object {titre, description, link, source}.

 

Source

  • // rss2Parser.as
  • //
  • // @author: BlackWizzard
  • // @description: analyse un flux rss 2.0
  • class rss2Parser {
  • public var xmlFile:String;
  • public var x:XML;
  • public var nObject:Object;
  • public var nArray:Array;
  • //
  • function rss2Parser(xml:String) {
  • System.useCodepage = true;
  • nObject = new Object();
  • nArray = new Array();
  • x = new XML();
  • x.ignoreWhite = true;
  • x.parseXML(xml);
  • parse();
  • }
  • //
  • function rssInfo() {
  • var tmpO:Object = new Object();
  • tmpO.title = getValueByRef(x.childNodes[0].childNodes[0], "title");
  • tmpO.link = getValueByRef(x.childNodes[0].childNodes[0], "link");
  • tmpO.description = getValueByRef(x.childNodes[0].childNodes[0], "description");
  • return tmpO;
  • }
  • //
  • function parse() {
  • var i:Number = getNodeNumberByRef(x.childNodes[0].childNodes[0], "item");
  • while (x.childNodes[0].childNodes[0].childNodes[i] != undefined) {
  • var tmpO:Object = new Object();
  • tmpO.titre = getValueByRef(x.childNodes[0].childNodes[0].childNodes[i], "title");
  • tmpO.description = ereg_replace(getValueByRef(x.childNodes[0].childNodes[0].childNodes[i], "description"), "n", "");
  • tmpO.description = ereg_replace(tmpO.description, "a>", "a>");
  • tmpO.description = ereg_replace(tmpO.description, "<a", "<a");
  • tmpO.description = ereg_replace(tmpO.description, "u>", "u>");
  • tmpO.description = ereg_replace(tmpO.description, "<u", "<u");
  • tmpO.description = ereg_replace(tmpO.description, "i>", "i>");
  • tmpO.description = ereg_replace(tmpO.description, "<i", "<i");
  • tmpO.description = ereg_replace(tmpO.description, "b>", "b>");
  • tmpO.description = ereg_replace(tmpO.description, "<b", "<b");
  • tmpO.description = ereg_replace(tmpO.description, "img>", "img>");
  • tmpO.description = ereg_replace(tmpO.description, "<img", "<img");
  • tmpO.description = ereg_replace(tmpO.description, "&apos;", "'");
  • tmpO.description = ereg_replace(tmpO.description, """, """);
  • tmpO.link = getValueByRef(x.childNodes[0].childNodes[0].childNodes[i], "link");
  • tmpO.source = getValueByRef(x.childNodes[0].childNodes[0].childNodes[i], "source");
  • nArray.push(tmpO);
  • i++;
  • }
  • return true;
  • }
  • //
  • function getValueByRef(xm:XML, s:String) {
  • var i:Number = 0;
  • while (xm.childNodes[i] != undefined) {
  • if (xm.childNodes[i].nodeName == s) {
  • return (xm.childNodes[i].childNodes[0].toString());
  • }
  • i++;
  • }
  • return "";
  • }
  • //
  • function getNodeNumberByRef(xm:XML, s:String) {
  • var i:Number = 0;
  • while (xm.childNodes[i] != undefined)
  • if (xm.childNodes[i].nodeName == s) {
  • return i;
  • }
  • i++;
  • }
  • }
  • //
  • function getValue():Object {
  • return nArray;
  • }
  • //
  • function isLoaded() {
  • if (x.getBytesLoaded() == x.getBytesTotal()) {
  • return 100;
  • } else {
  • return x.getBytesLoaded()/x.getBytesTotal()*100;
  • }
  • }
  • //
  • function ereg_replace(s, str, rep, chr) {
  • var t = (chr<0) ? s.substr(chr) : s.substr(0, chr);
  • var s = str.length;
  • var r = rep.length;
  • var p = t.indexOf(str);
  • while (p != -1) {
  • t = t.substr(0, p)+rep+t.substr(p+s);
  • p = t.indexOf(str, p+r);
  • }
  • return (chr) ? (chr<0) ? s.substr(0, s.length+chr)+t : t+s.substr(chr) : t;
  • }
  • }
// rss2Parser.as 
// 
// @author: BlackWizzard 
// @description: analyse un flux rss 2.0 
class rss2Parser { 
    public var xmlFile:String; 
    public var x:XML; 
    public var nObject:Object; 
    public var nArray:Array; 
    // 
    function rss2Parser(xml:String) { 
        System.useCodepage = true; 
        nObject = new Object(); 
        nArray = new Array(); 
        x = new XML(); 
        x.ignoreWhite = true; 
        x.parseXML(xml); 
        parse(); 
    } 
    // 
    function rssInfo() { 
        var tmpO:Object = new Object(); 
        tmpO.title = getValueByRef(x.childNodes[0].childNodes[0], "title"); 
        tmpO.link = getValueByRef(x.childNodes[0].childNodes[0], "link"); 
        tmpO.description = getValueByRef(x.childNodes[0].childNodes[0], "description"); 
        return tmpO; 
    } 
    // 
    function parse() { 
        var i:Number = getNodeNumberByRef(x.childNodes[0].childNodes[0], "item"); 
        while (x.childNodes[0].childNodes[0].childNodes[i] != undefined) { 
            var tmpO:Object = new Object(); 
            tmpO.titre = getValueByRef(x.childNodes[0].childNodes[0].childNodes[i], "title"); 
            tmpO.description = ereg_replace(getValueByRef(x.childNodes[0].childNodes[0].childNodes[i], "description"), "n", ""); 
            tmpO.description = ereg_replace(tmpO.description, "a>", "a>"); 
            tmpO.description = ereg_replace(tmpO.description, "<a", "<a"); 
            tmpO.description = ereg_replace(tmpO.description, "u>", "u>"); 
            tmpO.description = ereg_replace(tmpO.description, "<u", "<u"); 
            tmpO.description = ereg_replace(tmpO.description, "i>", "i>"); 
            tmpO.description = ereg_replace(tmpO.description, "<i", "<i"); 
            tmpO.description = ereg_replace(tmpO.description, "b>", "b>"); 
            tmpO.description = ereg_replace(tmpO.description, "<b", "<b"); 
            tmpO.description = ereg_replace(tmpO.description, "img>", "img>"); 
            tmpO.description = ereg_replace(tmpO.description, "<img", "<img"); 
            tmpO.description = ereg_replace(tmpO.description, "&apos;", "'"); 
            tmpO.description = ereg_replace(tmpO.description, """, """); 
            tmpO.link = getValueByRef(x.childNodes[0].childNodes[0].childNodes[i], "link"); 
            tmpO.source = getValueByRef(x.childNodes[0].childNodes[0].childNodes[i], "source"); 
            nArray.push(tmpO); 
            i++; 
        } 
        return true; 
    } 
    // 
    function getValueByRef(xm:XML, s:String) { 
        var i:Number = 0; 
        while (xm.childNodes[i] != undefined) { 
            if (xm.childNodes[i].nodeName == s) { 
                return (xm.childNodes[i].childNodes[0].toString()); 
            } 
            i++; 
        } 
        return ""; 
    } 
    // 
    function getNodeNumberByRef(xm:XML, s:String) { 
        var i:Number = 0; 
        while (xm.childNodes[i] != undefined)  
            if (xm.childNodes[i].nodeName == s) { 
                return i; 
            } 
            i++; 
        } 
    } 
    // 
    function getValue():Object { 
        return nArray; 
    } 
    // 
    function isLoaded() { 
        if (x.getBytesLoaded() == x.getBytesTotal()) { 
            return 100; 
        } else { 
            return x.getBytesLoaded()/x.getBytesTotal()*100; 
        } 
    } 
    // 
    function ereg_replace(s, str, rep, chr) { 
        var t = (chr<0) ? s.substr(chr) : s.substr(0, chr); 
        var s = str.length; 
        var r = rep.length; 
        var p = t.indexOf(str); 
        while (p != -1) { 
            t = t.substr(0, p)+rep+t.substr(p+s); 
            p = t.indexOf(str, p+r); 
        } 
        return (chr) ? (chr<0) ? s.substr(0, s.length+chr)+t : t+s.substr(chr) : t; 
    } 
} 

Historique

13 juillet 2004 22:37:23 :
cette source bouge vers MX2004:CLASS

Commentaires et avis

signaler à un administrateur
Commentaire de TomQuick le 29/04/2004 16:48:07

Génial, que dire de plus avec toi...
Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh fabuleux, 10/10...

signaler à un administrateur
Commentaire de BlackWizzard le 29/04/2004 16:53:37 administrateur CS

J'ai oublié de dire, toutes les balises html s'afficherons tel-quel, sauf b, i, u et a qui seront interpretés (du moins, si le champ de texte est html enabled)

signaler à un administrateur
Commentaire de afad le 30/04/2004 10:21:17

Salut, excuse moi de te dire ça mais je te vois parser ton XML façon Flash MX, tu fais une boucle et tu recuperes les noeuds xml, c'est obsolête par rapport aux fonctionnalités de MX2004 ton truc !!!!!

Ya bien plus simple dans les datas components de MX2004 ça s'appelle XMLConnector(chargement du xml) et DataSet(collecte les noeuds et les parse)...

Regarde ici, si c'est pas clair : http://www.macromedia.com/fr/devnet/mx/flash/data_integration02.html#xml

A+
aFaD

signaler à un administrateur
Commentaire de afad le 30/04/2004 11:22:04

ta fonction ereg_replace, je trouve ça purement génial, aahhhh des fois, on aimerait bien avoir les fonctionnalités d'un bon PHP pour certaines actions, bien vu :)

A+
aFaD

signaler à un administrateur
Commentaire de tom le 30/04/2004 11:56:19 administrateur CS

Juste un truc black, quand parse a fini de trier, tu devrais faire appel à une fonction non définie, du style onparsecomplete(), comme ca il n'y a plus qu'a faire rss2.onparsecomplete() = function{};
mais bon, c'est un detail... Et ca tue...

signaler à un administrateur
Commentaire de BlackWizzard le 30/04/2004 12:23:19 administrateur CS

faire rss2.onparsecomplete() = function{}; ça implique d'utiliser UIEvent et je ne me suis pas encore penché sur cette class...
pour xmlConnnector, etc, je sais, mais je prefere tout maitriser et faire des class autonomes, et pouvoir gerer exactement comme je vx mon xml...

signaler à un administrateur
Commentaire de afad le 30/04/2004 14:01:28

C'est tout à ton honneur Black.

Je voulais apporter une précision pour les personnes souhaitant créer leur propre flux RSS, vous savez que flash ne charge pas de fichier sur serveur distant (sauf utilisation de l'astuce proposée par Black), pb de sécurité.... Dans un cas général, pour palier ce pb et être sur que tout le monde puisse avoir accès à votre flux, insêrer un second XML à la racine de votre serveur avec votre RSS.xml qui doit s'appeler : crossdomain.xml et ayant pour contenu :

&lt;?xml version="1.0"?&gt;
  &lt;!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"&gt;
  &lt;cross-domain-policy&gt;
    &lt;allow-access-from domain="*" /&gt;
  &lt;/cross-domain-policy&gt;

Si vous souhaiter autoriser l'accès uniquement pour quelques sites, remplacez * par vos url, exemple :

&lt;?xml version="1.0"?&gt;
  &lt;!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"&gt;
  &lt;cross-domain-policy&gt;
    &lt;allow-access-from domain="journaldunet.com" /&gt;
    &lt;allow-access-from domain="www.journaldunet.com" /&gt;
    &lt;allow-access-from domain="developpeurs.journaldunet.com" /&gt;
    &lt;allow-access-from domain="www.grolapinrose.tk" /&gt;
  &lt;/cross-domain-policy&gt;

Cela s'applique à tous les types de fichiers externes : texte, JPEG, MP3, SWF, ActionScript... Donc, à prendre impérativement en compte pour vos nouveaux sites, et à mettre impérativement en place pour les anciens !

Info piquée sur le JDNet

A+
aFaD

signaler à un administrateur
Commentaire de BlackWizzard le 30/04/2004 18:24:37 administrateur CS

ya plus simple...
var x:XML = new XML();
x.ignoreWhite = true;
__x = new LoadVars();
__x.sendAndLoad("http://rss", x);

;)
loadVars ne possede pas de restriction... c donc a lui de charger le xml...

signaler à un administrateur
Commentaire de afad le 30/04/2004 18:45:19

Oui, je sais mais ce n'est pas une astuce pour le receveur mais pour l'émetteur du XML ou autre fichier, afin d'être certains de pouvoir exporter son fichier à n'importe qui, parce que tout le monde n'utilisera pas forcement de loadvars pour leur appel.....

A+
aFaD

signaler à un administrateur
Commentaire de top30 le 30/04/2004 22:36:34

QUE NON QUE NON QUE NON BW !

Incrusté un onParseComplete n'implique AUCUNE classe suplémentaire, c est la grand GRANDE force de l'as2

Tu déclares ta function comme n'importe que variable :
// var onParseComplete:Function ;

Tu l'appelles en fin de parse...
this.onParseComplete (unParamQueTuveux) ;

Et rien de plus, ca marchera comme pour un XML ;
Il faudra juste que l'utilisateur créer son "parseEvent (onParseComplete), AVANT de commencer le parse...

Et ca marchera... C est pourquoi finalement des fois il est bien de ne pas forcement lancer de grand "chose" une fois... Mais de préparer, ajouter, lancer...

Toutes mes Classes sont comme ceux-ci. C est pourquoi j'utilise peu de GDipsatcher par exemple.. Regardes celle du Server.. Tu verras que les fonctions onDownload de la frame 1, ne sont QUE déclarées dans les Class...

; )

signaler à un administrateur
Commentaire de BlackWizzard le 30/04/2004 22:39:56 administrateur CS

v matter tout ça...

signaler à un administrateur
Commentaire de afad le 14/05/2004 21:28:04

Re,
je passais dans le coin pour vous signaler (si ça vous interesse) que je viens de poster une source sur PHPCS concernant un générateur de flux RSS 2.0 à partir de variables MySQL, utile pour votre systême de news géré par PHP et MySQL....

C'est ici que ça se passe : http://www.phpcs.com/code.aspx?ID=22822

A+ les ptits loups
aFaD

signaler à un administrateur
Commentaire de atchoumdu51 le 30/06/2005 17:04:58

chez moi flash trouve des erreurs.
J'ai fait copier/coller du site vers un fichier rss2Parser.as dans le répertoire de mon fla. J'ai regardé la source et ajouté une accolade dans la fonction getNodeNumberByRef, car il me dit unexpected "{" a la fin et c'est a cet endroit qu'elle semblait manquer, mais il y a encore des problemes et malgré tout ce que j'ai essayé ca na marche pas...Quelqu'un peut m'aider svp...

signaler à un administrateur
Commentaire de satansin le 05/09/2005 20:07:11

Salut, j'ai une question sur le code. Je vois "childNodes[0]", y a-t-il une difference avec firstChild?

signaler à un administrateur
Commentaire de BlackWizzard le 06/09/2005 07:58:09 administrateur CS

non, aucune difference.
Juste plus clair je trouve...

signaler à un administrateur
Commentaire de snakeeater1 le 04/04/2006 11:56:51

up ( dsl )
voila l'astuce du loadVars ne marche pas !
un exemple ici : http://labo.bkcreation.info/flashtest/rss.html
et voila mon code source :

import bkcore.strlibs.str;

System.useCodepage = true;
var x:XML = new XML();
x.ignoreWhite = true;
__x = new LoadVars();
x.onLoad = function()
{
_root.txt.text = str.parseHTML(_root.x.toString());
}
__x.sendAndLoad("http://www.flashkod.com/rss.aspx?type=code", x);

Y aurait-il une autre astuce ? car j'ai vraiment besoin de faire une lecteur de flux RSS :/

signaler à un administrateur
Commentaire de agsirhk le 14/12/2006 13:14:08

Bonjour,
J'ai le fameux problème de sécurité flash sur le chargement distant d'un flux rss.
Deux points : le flux ce présente sous la forme "http://DOMAINE/source.php?Id=id&Mdp=mdp&Rubrique=NEWS"
J'essaie donc de charger tout ca, ca fonctionne en local puis sur le serveur de ma boite plus rien ne s'affiche. Je ne sais pas quoi faire je suis réelement coincé et n'est pas les connaissances Black ou autre :p

Bon si vous pouvez m'aider c'est urgentissime :'(

Contact diredct : lhauck@putsch-paris.fr

signaler à un administrateur
Commentaire de BlackWizzard le 14/12/2006 21:02:36 administrateur CS

Va faire un tour sur cette page:
http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_14213#load

signaler à un administrateur
Commentaire de agsirhk le 15/12/2006 10:36:16

Merci à tous pour l'info j'ai solutionner le problème grace à la source de Loubidou "CONTOURNEMENT DU PROBLÈME DE SÉCURITÉ CROSSDOMAIN DE FLASH POUR LE CHARGEMENT DE DONNÉES !" enfin voila encore bravo et merci à tous.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.