Gérer le forum:  Aide  •  Rechercher  •  Liste des Membres  •  Groupes d'utilisateurs   •  S'enregistrer  •  Profil  •  Se connecter pour vérifier ses messages privés  •  Connexion 
 [Java] Utilisation de SAX Voir le sujet suivant
Voir le sujet précédent
Poster un nouveau sujetRépondre au sujet
Auteur Message
kazhar
Accro à Web-IG
Accro à Web-IG



Sexe: Sexe:Masculin
Messages: 126
Localisation: Lyon

MessagePosté le: Mar 21 Nov 2006 - 18:28 Répondre en citantRevenir en haut

Bonjour,

Dans le cadre de la réalisation d'un lecteur RSS en Java, je cherche à parser un document XML (jusque là, rien d'anormal)

J'ai une classe RssItem qui contient chacun des items de mon flux.
Code:
public class RssItem {
    int Read;
    private String UrlItem, TitleItem, DescItem, PubDate;
    public static int nbUnread;
   
    /* Constructeur
    * Argument : item déjà lu ou non */
    public RssItem(int isread) {
        Read = isread;
        UrlItem = "";
        TitleItem = "";
        DescItem = "";
        PubDate = "";
       
        //Si le sujet est pas lu, on incrémente le compteur
        if (Read == 0) {
            nbUnread = nbUnread + 1;   
        }
    }
    public void setUrl(String U) {
        UrlItem = U;
    }
    public void setTitle(String T) {
        TitleItem = T;
    }
    public void setDesc(String D) {
         DescItem = D;
    }
    public void setDate(String D) {
         PubDate = D;
    }
    /* retourne le fait que l'item ait déjà été lu ou non */
    public boolean isRead() {
        if (Read == 0) return false;
        else return true;   
    }
    public void setRead() {
        if (Read == 0) {
            Read = 1;
            nbUnread = nbUnread - 1;
        }
    }
}


Et une classe RefreshFeed, appellée dans une classe RssFeed, qui prends l'URL de mon feed, et qui ajoute tous mes items dans ma seconde classe (je ne gère pas encore la suppression des doublons)

Code:
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
import java.io.*;
import java.util.*;

/**
 * Classe RefreshFeed. Récupère les derniers items d'un flux passé en paramètre
 *
 * @author kazhar
 * @version 0.1
 */
public class RefreshFeed extends DefaultHandler {
    private RssItem el;
    private ArrayList Items;
    private StringBuffer buffer;
    private String Ur;

    /**
     * Constructor for objects of class RefreshFeed
     * @parameters Url adresse du flux
     */
    public RefreshFeed(String Url) {
        Ur = Url;
    }


    /**
     * Parse le document, et place les items dans la variable locale Items
     * @return boolean action réussie ou non
    */
    public boolean refresh() {
        try {
            Items.clear();

            //Création d'une "fabrique" de parseurs
            SAXParserFactory fabrique = SAXParserFactory.newInstance();           
            // création d'un parseur
            SAXParser parseur = fabrique.newSAXParser();
           
            // lecture d'un fichier XML avec un DefaultHandler
            File fichier = new File(Ur);
           
            //Définition des actions
            DefaultHandler gestionnaire = new DefaultHandler(){
                //Début de document
                public void startDocument() throws SAXException {
                    //On concoit l'arraylist qui contiendra les éléments
                    ArrayList it = new ArrayList();
                }
                //Fin de document
                public void endDocument() throws SAXException {}
                //Début élément
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    if (qName.equals("item")) {
                        el = new RssItem(0);
                    } else {
                        buffer = new StringBuffer();
                    }
                }
                //Fin élément
                public void endElement(String uri, String localName, String qName) throws SAXException{
                    if (qName.equals("item")) {
                       Items.add(el);
                    } else if (qName.equals("title")) {
                        el.setTitle(buffer.toString());
                    } else if (qName.equals("link")) {
                        el.setUrl(buffer.toString());
                    } else if (qName.equals("description")) {
                        el.setDesc(buffer.toString());
                    } else if (qName.equals("PubDate")) {
                        el.setDate(buffer.toString());
                    }
                }
                //Texte
                public void characters(char[] ch, int start, int length) throws SAXException{
                    String lecture = new String(ch,start,length);
                    if(buffer != null) buffer.append(lecture); 
                }
            };
            parseur.parse(fichier, gestionnaire);
            return true;
        } catch(ParserConfigurationException pce){
            System.out.println("Erreur de configuration du parseur");
            System.out.println("Lors de l'appel à newSAXParser()");
            return false;
        } catch(SAXException se){
            System.out.println("Erreur de parsing");
            System.out.println("Lors de l'appel à parse()");
            return false;
        } catch(IOException ioe){
            System.out.println("Erreur d'entrée/sortie");
            System.out.println("Lors de l'appel à parse()");
            return false;
        }
    }
   
    /**
     * Renvoie les items obtenus lors du dernier refresh
     * @return ArrayList des items récupérés
     */
    public ArrayList get() {
        return Items;
    }
}

Mon parseur est tiré du tutoriel SAX disponible sur developpez.com.
Cependant, quelconque soit l'url de mon flux, j'ai toujours une erreur d'entrée sortie.

Si quelqu'un s'est déjà amusé avec sax et à rencontré un problème similaire afin de me guider un minimum Razz
Voir le profil de l'utilisateurEnvoyer un message privéVisiter le site web du posteur

N'oubliez pas de vous inscrire à la communauté pour participer. Si vous êtes déjà membre, connectez-vous pour faire disparaître ce bandeau publicitaire.
kazhar
Accro à Web-IG
Accro à Web-IG



Sexe: Sexe:Masculin
Messages: 126
Localisation: Lyon

MessagePosté le: Mar 21 Nov 2006 - 20:05 Répondre en citantRevenir en haut

Bon bon j'admets, je suis un boulet.
File() n'admet des String que pour les chemins locaux.
Avec une variable URI, ça fonctionne, excepté qu'il me renvoie un IllegalArgumentException, mais je vais chercher.
Voir le profil de l'utilisateurEnvoyer un message privéVisiter le site web du posteur
Montrer les messages depuis:      
Poster un nouveau sujetRépondre au sujet
 Sauter vers:   



Voir le sujet suivant
Voir le sujet précédent
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum