Publié le 04/10/2010
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Lire un flux RSS en parsant le fichier XML

Un flux RSS est un fichier XML au format standardisé reprenant en général les actualités d'un site internet. Pour extraire les données, la class RSSReader utilise les fonctions de lecture d'un fichier XML (DOM).

Flux RSS dans un fichier XML classique

Les niveaux et les balises de l'arborescence sont définis par des spécifications publiées par W3C. Cette structure du fichier XML favorise la syndication de contenus et l'automatisation de la diffusion des informations.

Exemple de flux, les news de Fobec.com
<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
  <channel>
    <title>www.fobec.com site communautaire du developpement informatique</title>
    <link>http://www.fobec.com</link>
    <description>Les nouveaux articles, tutoriels et logiciels autour du developpement informatique.</description>
    <language>fr</language>
    <lastBuildDate>Mon, 04 Oct 2010 09:45:55 GMT</lastBuildDate>
    <image>
      <title>www.fobec.com site communautaire du developpement informatique</title>
      <url>http://www.fobec.com/CMS/logo.gif</url>
      <link>http://www.fobec.com</link>
      <width>144</width>
      <height>42</height>
    </image>
    <item>
      <title>Réduire le chargement d'une page à moins d'une seconde</title>
      <link>http://www.fobec.com/CMS/web/webmaster/reduire-chargement-une-page-moins-une-seconde_1013.html</link>
      <description><![CDATA[Webmaster, optimiser le temps de chargement de vos pages !  Ce conseil revient assez souvent dans la bouche des SEO. Il en est de męme pour Google qui a intégré l&#039;outil Performance du site dans son outil WebmasterTools.Pour analyser le...]]></description>
      <pubDate>Fri, 01 Oct 2010 14:21:56 GMT</pubDate>
      <guid>http://www.fobec.com/CMS/web/webmaster/reduire-chargement-une-page-moins-une-seconde_1013.html</guid>
    </item>
    <item>
      <title>Programmer soi-męme le jeu du démineur</title>
      <link>http://www.fobec.com/CMS/java/class/programmer-soi-meme-jeu-demineur_1012.html</link>
      <description><![CDATA[On connait tous le jeu du démineur grâce à Bill qui le fourni avec son OS. Le but est de retrouver les bombes qui se cachent derrière les p&#039;tites cases grises.Voici un exemple de code source du jeu du démineur fait en JAVA. Peu de ligne de...]]></description>
      <pubDate>Fri, 01 Oct 2010 09:26:30 GMT</pubDate>
      <guid>http://www.fobec.com/CMS/java/class/programmer-soi-meme-jeu-demineur_1012.html</guid>
    </item>
....
</channel>
</rss>

Charger et lire le contenu d'un flux RSS

Pour parser le flux RSS, la class RSSReader effectue les opérations suivantes:
- charger le fichier XML sur le site internet,
- initialiser le parseur XML avec DocumentBuilderFactory
- lire la valeur des éléments avec la technique appelée DOM.
import java.io.IOException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
 
/**
 * Parser un flux RSS
 * @author Fobec 2010
 */
 
public class RSSReader {
 
    /**
     * Parser le fichier XML
     * @param feedurl URL du flux RSS
     */
    public void parse(String feedurl) {
        try {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            URL url = new URL(feedurl);
            Document doc = builder.parse(url.openStream());
            NodeList nodes = null;
            Element element = null;
            /**
             * Titre et date du flux
             */
            nodes = doc.getElementsByTagName("title");
            Node node = doc.getDocumentElement();
            System.out.println("Flux RSS: " + this.readNode(node, "channel|title"));
            System.out.println("Date de publication: " + GMTDateToFrench(this.readNode(node, "channel|lastBuildDate")));
            System.out.println();
            /**
             * Elements du flux RSS
             **/
            nodes = doc.getElementsByTagName("item");
            for (int i = 0; i < nodes.getLength(); i++) {
                element = (Element) nodes.item(i);
                System.out.println("Titre: " + readNode(element, "title"));
                System.out.println("Lien: " + readNode(element, "link"));
                System.out.println("Date: " + GMTDateToFrench(readNode(element, "pubDate")));
                System.out.println("Description: " + readNode(element, "description"));
                System.out.println();
            } //for
            //for
        } catch (SAXException ex) {
            Logger.getLogger(RSSReader.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(RSSReader.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(RSSReader.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 
    /**
     * Méthode permettant de retourner ce que contient d'un noeud
     * @param _node le noeud principal
     * @param _path suite des noms des noeud sans espace séparer par des "|"
     * @return un string contenant le valeur du noeud voulut
     */
    public String readNode(Node _node, String _path) {
 
        String[] paths = _path.split("|");
        Node node = null;
 
        if (paths != null && paths.length > 0) {
            node = _node;
 
            for (int i = 0; i < paths.length; i++) {
                node = getChildByName(node, paths[i].trim());
            }
        }
 
        if (node != null) {
            return node.getTextContent();
        } else {
            return "";
        }
    }
 
    /**
     * renvoye le nom d'un noeud fils a partir de son nom
     * @param _node noeud pricipal
     * @param _name nom du noeud fils
     * @return le noeud fils
     */
    public Node getChildByName(Node _node, String _name) {
        if (_node == null) {
            return null;
        }
        NodeList listChild = _node.getChildNodes();
 
        if (listChild != null) {
            for (int i = 0; i < listChild.getLength(); i++) {
                Node child = listChild.item(i);
                if (child != null) {
                    if ((child.getNodeName() != null && (_name.equals(child.getNodeName()))) || (child.getLocalName() != null && (_name.equals(child.getLocalName())))) {
                        return child;
                    }
                }
            }
        }
        return null;
    }
 
    /**
     * Afficher une Date GML au format francais
     * @param gmtDate
     * @return
     */
    public String GMTDateToFrench(String gmtDate) {
        try {
            SimpleDateFormat dfGMT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
            dfGMT.parse(gmtDate);
            SimpleDateFormat dfFrench = new SimpleDateFormat("EEEE, d MMMM yyyy HH:mm:ss", Locale.FRANCE);
            return dfFrench.format(dfGMT.getCalendar().getTime());
        } catch (ParseException ex) {
            Logger.getLogger(RSSReader.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "";
    }
 
    /**
     * Exemple
     * @param args
     */
    public static void main(String[] args) {
        RSSReader reader = new RSSReader();
        reader.parse("http://fobec.com/CMS/fobec.xml");
    }
}

Résultat de l'extraction des informations:
Les données sont affichées dans la console JAVA, les informations extraites prennent la forme suivante:
Flux RSS: www.fobec.com site communautaire du developpement informatique
Date de publication: lundi, 4 octobre 2010 11:45:55

Titre: Réduire le chargement d'une page à moins d'une seconde
Lien: http://www.fobec.com/CMS/web/webmaster/reduire-chargement-une-page-moins-une-seconde_1013.html
Date: vendredi, 1 octobre 2010 16:21:56
Description: Webmaster, optimiser le temps de chargement de vos pages ! Ce conseil revient assez souvent dans la bouche des SEO. Il en est de męme pour Google qui a intégré l'outil Performance du site dans son outil WebmasterTools.Pour analyser le...

Titre: Programmer soi-męme le jeu du démineur
Lien: http://www.fobec.com/CMS/java/class/programmer-soi-meme-jeu-demineur_1012.html
Date: vendredi, 1 octobre 2010 11:26:30
Description: On connait tous le jeu du démineur grace à Bill qui le fourni avec son OS. Le but est de retrouver les bombes qui se cachent derrière les p'tites cases grises.Voici un exemple de code source du jeu du démineur fait en JAVA. Peu de ligne de...

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
java - class
Mise a jour
04/10/2010
Visualisation
vu 7057 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 267 articles
|BIO_PSEUDO|
Commentaires récents

Publié par luckyboy dans CMS

ont voir rien pas de code!!!!

Publié par Berenger dans java

Bonjour Mr Foebec je suis vraiment très content de cette réponse vous êtes simplement génial. quand je pense au nombre de jour que ça m'a pris et le temps que j'ai pe...

Publié par ammar dans CMS

merci pour ce code , mais ce que je veux savoir c\'est es-ce que possible de récupérer la totalité de code source html de la page original.<br>merci...

Publié par Fobec dans tuto

Merci pour la remarque Toluar,
Les user-agent sont effectivement un bon indicateur pour les utilisateurs. Les crawlers et robots en tout genre ne prennent pas toujours la peine de renseigner cette...

Publié par l'indik dans java

Sauf que si l'objet n'est plus utilisé, quand tu fait ton new , la mémoire sera automatiquement libéré si cela est nécessaire. Donc l'utilisation de System.gc() n'es...