Autore Topic: Parsing RSS problema caratteri speciali  (Letto 1129 volte)

Offline ucn1985

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    ideos
Parsing RSS problema caratteri speciali
« il: 22 Febbraio 2011, 15:11:45 CET »
0
Ciao,
ho utilizzato un esempio di lettore rss implementato qui
Build a mobile RSS reader

Funziona tutto correttamente però se nel file rss da leggere nel titolo ci sono simboli strani tipo apici o virgolette mi tronca il titolo.
Come faccio a non farmi troncare il titolo?

Questo è un esempio dell'xml

Codice (XML): [Seleziona]
<item>
<title>Gillet: &quot;Non dobbiamo arrenderci&quot;</title>
<link>[url=http://www.solobarinews.it/news.php?id=499</link>]Gillet: "Non dobbiamo arrenderci"[/url]
<description>Prima della partenza per Roma, stamane nella sala stampa dello stadio San Nicola ha parlato il capit...</description>
<author>SoloBariNews.it</author>
<dataora>Venerdi 18 Febbraio 2011</dataora>
</item>


Il codice utilizzato per il parse è

Codice: [Seleziona]
    private RSSFeed getFeed(String urlToRssFeed)
    {
            try
            {
                    // setup the url
               URL url = new URL(urlToRssFeed);
               

           // create the factory
           SAXParserFactory factory = SAXParserFactory.newInstance();
           // create a parser
           SAXParser parser = factory.newSAXParser();

           // create the reader (scanner)
           XMLReader xmlreader = parser.getXMLReader();
           // instantiate our handler
           RSSHandler theRssHandler = new RSSHandler();
           // assign our handler
           xmlreader.setContentHandler(theRssHandler);
           // get our data via the url class
           InputSource is = new InputSource(url.openStream());
           // perform the synchronous parse           
           xmlreader.parse(is);
           // get the results - should be a fully populated RSSFeed instance, or null on error
           return theRssHandler.getFeed();
            }
            catch (Exception ee)
            {
                    // if we have a problem, simply return null
                    return null;
            }
    }



Codice: [Seleziona]
package com.msi.SoloBariNews;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;



public class RSSHandler extends DefaultHandler
{
       
        RSSFeed _feed;
        RSSItem _item;
        String _lastElementName = "";
        boolean bFoundChannel = false;
        final int RSS_TITLE = 1;
        final int RSS_LINK = 2;
        final int RSS_DESCRIPTION = 3;
        final int RSS_CATEGORY = 4;
        final int RSS_PUBDATE = 5;
       
        int depth = 0;
        int currentstate = 0;
        /*
         * Constructor
         */
        RSSHandler()
        {
        }
       
        /*
         * getFeed - this returns our feed when all of the parsing is complete
         */
        RSSFeed getFeed()
        {
                return _feed;
        }
       
       
        public void startDocument() throws SAXException
        {
                // initialize our RSSFeed object - this will hold our parsed contents
                _feed = new RSSFeed();
                // initialize the RSSItem object - we will use this as a crutch to grab the info from the channel
                // because the channel and items have very similar entries..
                _item = new RSSItem();

        }
        public void endDocument() throws SAXException
        {
        }
        public void startElement(String namespaceURI, String localName,String qName, Attributes atts) throws SAXException
        {
                depth++;
                if (localName.equals("channel"))
                {
                        currentstate = 0;
                        return;
                }
                if (localName.equals("image"))
                {
                        // record our feed data - we temporarily stored it in the item :)
                        _feed.setTitle(_item.getTitle());
                        _feed.setPubDate(_item.getPubDate());
                }
                if (localName.equals("item"))
                {
                        // create a new item
                        _item = new RSSItem();
                        return;
                }
                if (localName.equals("title"))
                {
                        currentstate = RSS_TITLE;
                        return;
                }
                if (localName.equals("description"))
                {
                        currentstate = RSS_DESCRIPTION;
                        return;
                }
                if (localName.equals("link"))
                {
                        currentstate = RSS_LINK;
                        return;
                }
                if (localName.equals("category"))
                {
                        currentstate = RSS_CATEGORY;
                        return;
                }
                if (localName.equals("pubDate"))
                {
                        currentstate = RSS_PUBDATE;
                        return;
                }
                // if we don't explicitly handle the element, make sure we don't wind up erroneously
                // storing a newline or other bogus data into one of our existing elements
                currentstate = 0;
        }
       
        public void endElement(String namespaceURI, String localName, String qName) throws SAXException
        {
                depth--;
                if (localName.equals("item"))
                {
                        // add our item to the list!
                        _feed.addItem(_item);
                        return;
                }
        }
         
        public void characters(char ch[], int start, int length)
        {
                String theString = new String(ch,start,length);
                Log.i("RSSReader","characters[" + theString + "]");
               
                switch (currentstate)
                {
                        case RSS_TITLE:
                                _item.setTitle(theString);
                                currentstate = 0;
                                break;
                        case RSS_LINK:
                                _item.setLink(theString);
                                currentstate = 0;
                                break;
                        case RSS_DESCRIPTION:
                                _item.setDescription(theString);
                                currentstate = 0;
                                break;
                        case RSS_CATEGORY:
                                _item.setCategory(theString);
                                currentstate = 0;
                                break;
                        case RSS_PUBDATE:
                                _item.setPubDate(theString);
                                currentstate = 0;
                                break;
                        default:
                                return;
                }
               
        }
}


Offline TheWorstEver_

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia 10 Mini
  • Sistema operativo:
    Windows 7
Re:Parsing RSS problema caratteri speciali
« Risposta #1 il: 17 Marzo 2011, 19:23:15 CET »
0
Anche io ho lo stesso problema. Spero qualcuno risponda presto al topic (y)

Offline TheWorstEver_

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia 10 Mini
  • Sistema operativo:
    Windows 7
Re:Parsing RSS problema caratteri speciali
« Risposta #2 il: 17 Marzo 2011, 20:37:47 CET »
+1
Hei caro, va che ho trovato una soluzione.

Come pensavo al carattere  '  (apice) il parser legge come se fosse un nuovo nodo fratello del primo. per risolvere ciò io ho eseguito un codice del genere :
Codice (Java): [Seleziona]
for (int n =0; n < elemento.getChildNodes().getLength(); n++)
                                {
                                        if (n==0) { stringa =((Node) elemento.getChildNodes().item(n)).getNodeValue();}
                                        else {stringa = stringa+"'"+ ((Node) elemento.getChildNodes().item(n)).getNodeValue();}
                                }

Nota: il controllo lo ho messo per sistemare bene gli apici. perchè senno mi avrebbe scritto tutto cosi " 'Ciao, come stai?" <-- con l'apice davanti.

NOTA: il codice scritto cosi com'è non funziona, visto che l'albero del file DOM è diverso, bisogna non prendere gli attributi del nodo. Ma credo che con un po' di ragionamenti un algoritmo lo si trova.


Spero di esserti stato di aiuto. Ciao.


Ecco che per la quarta volta rimodifico il post.
Io ho risolto completamente facendo cosi :
Codice (Java): [Seleziona]
                                for (int n =0; n < elemento.getChildNodes().getLength(); n++)
                                {
                                        if (n==0) { stringa =((Node) elemento.getChildNodes().item(n)).getNodeValue();}  //controllo che l'apice non finisca all'inizio della frase
                                        else {n++; stringa = stringa+"'"+ ((Node) elemento.getChildNodes().item(n)).getNodeValue();}    // controllo che salta gli attributi del nodo,e unisco la stringa con l'apice
                                }

ciao (:
« Ultima modifica: 17 Marzo 2011, 21:33:51 CET da TheWorstEver_ »

Offline TheWorstEver_

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia 10 Mini
  • Sistema operativo:
    Windows 7
Re:Parsing RSS problema caratteri speciali
« Risposta #3 il: 17 Marzo 2011, 22:04:31 CET »
0
Ho fatto una versione definitiva di quello che cerchi.
Codice (Java): [Seleziona]
 public static String controlloApici(NodeList nl)   //restituisce la stringa di tutti i nodi "figli", senza contare gli attributi dei nodi (spesso = null)
 {
         String stringa="";
         for (int n =0; n < nl.getLength(); n++)
                {
                        if (n==0) { stringa =((Node) nl.item(n)).getNodeValue();}  //controllo che l'apice non finisca all'inizio della frase
                        else {n++; stringa = stringa+"'"+ ((Node) nl.item(n)).getNodeValue();}  // controllo che salta gli attributi del nodo,e unisco la stringa con l'apice
                }
         return stringa;
 }

Questa è una funzione che ti restituisce una stringa a cui devi passare, premettendo che il tuo nodo si chiami NODO,
Codice (Java): [Seleziona]
NODO.getChildNodes();
Ciao (:

Offline ldc

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Parsing RSS problema caratteri speciali
« Risposta #4 il: 05 Marzo 2012, 19:55:18 CET »
0
Ragazzi,

non è che potete postare i file completi ?

Ho letto l'articolo e scaricato il codice sorgente ma in realtà l'ho trovato un po' datato...
ad esempio R.java andrebbe rimosso, startSubActivity non so che sia, ecc ecc...

allego lo zip dei file originali.

Potete postare per favore i file aggiornati funzionanti ?

grazie

Offline TheWorstEver_

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia 10 Mini
  • Sistema operativo:
    Windows 7
Re:Parsing RSS problema caratteri speciali
« Risposta #5 il: 06 Marzo 2012, 17:13:43 CET »
0
Ciao Idc,

cosa ti serve di preciso ? Io, l'unico sorgente che possiedo è quello della applicazione, postata sul market e estremamente customizzata, e  purtroppo non posso girare i sorgenti a nessuno.

Se ti interessa leggere un file xml con android, io ho usato un DOM Parser, non ho neanche mai guardato il lettore di RSS, del post XD

http://android-pro.blogspot.com/2011/07/parsing-xml-wit-dom-parser.html

Qualche riga di codice, è molto semplice (:

Offline ldc

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Parsing RSS problema caratteri speciali
« Risposta #6 il: 06 Marzo 2012, 21:02:29 CET »
0
ok, grazie lo stesso.