Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [JAVA] Problema parse Sax caratteri speciali

    Salve a tutti.
    Ho creato un piccolo progetto Java che legge una serie di link rss, ne apre l'url e scorre il file xml per catturare i post con le notizie e le varie informazioni.
    Il programma funziona e gira bene. Ho solo un problema con pochi file xml.
    Sto usando il parse Sax e questo è un pezzo della classe che "cattura i dati":
    codice:
    public class myHandler extends DefaultHandler {
    
        private Post post;
        private String temp=""; 
        private ArrayList<Post> postList=new ArrayList<Post>();
        private boolean title=false,description=false,link=false, pubDate=false,item=false,category=false;
        private ReplaceChar r=new ReplaceChar();
        
        /** Metodo che legge i tag di apertura '<'**/
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
        {
            temp = "";
            if(qName.equalsIgnoreCase("item")){ 
                post=new Post();
                item=true;
            }else if (qName.equalsIgnoreCase("title")) {
                title=true;
            }else if (qName.equalsIgnoreCase("description")) {
                description=true;
            }else if (qName.equalsIgnoreCase("link")) {
                link=true;
            }else if (qName.equalsIgnoreCase("pubDate")) {
                pubDate=true;
            }else if(qName.equalsIgnoreCase("category")){
                category=true;
            }
    
        }
    
        /** Metodo per il reperimento delle informazioni infra tag*/
        public void characters(char ch[], int start, int length) throws SAXException
        {
            temp= new String(ch,start,length);
            /*Passo la stringa per la pulizia dai caratteri speciali*/
            temp=r.change(temp);
            if(item==true){
                if(title){
                    post.setTitle(temp);
                    title=false;
                }else if(description){
                    post.setDescr(temp);
                    description=false;
                    temp=temp.replaceAll("[<](/)?a[^>]*[>]", " ");
                    temp=temp.replaceAll("[<](/)?img[^>]*[>]", "");
                    post.setText(temp);
                }else if(link){
                    post.setLink(temp);
                    link=false;
                }else if(pubDate){
                    post.setPubDate(temp);
                    pubDate=false;
                }else if(category){
                    post.setCat(temp);
                    category=false;
                }
            }
        }
    
        /** Metodo che legge i tag di chiusura '<'**/
        public void endElement(String uri, String localName, String qName) throws SAXException
        {
            if(qName.equals("item")){
                postList.add(post);
                item=false;
            }
        }

    In sostanza un item come questo:
    codice:
    <title><![CDATA[ La sede della Presidenza della Repubblica  diventa un nuovo, straordinario, museo...]]></title>
          <link>http://www.facebook.com/corrieredellasera/posts/10153128020747530</link>
           <description><![CDATA[La sede della Presidenza della  Repubblica diventa un nuovo, straordinario, museo pubblico, assecondando  il desiderio di Mattarella di far diventare il Quirinale «la casa degli  Italiani»<br/><br/><a  href="http://l.facebook.com....>Link</a>]]></description>
          <pubDate>Tue, 26 May 2015 14:30:01 +0100</pubDate>
          <author>Corriere della Sera</author>
          <dc:creator>Corriere della Sera</dc:creator>
    </item>
    Mi ritorna:
    codice:
    Title:La sede della Presidenza della Repubblica  diventa un nuovo, straordinario, museo...
    Description:La sede della Presidenza della  Repubblica diventa un nuovo, straordinario, museo pubblico, assecondando  il desiderio di Mattarella di far diventare il Quirinale «la casa degli  Italiani»
    Link
    pubDate:Tue, 26 May 2015 14:30:01 +0100
    Ed è quello che voglio. Ma ci sono file xml che sono composti in modo diverso come ad esempio questo:
    codice:
    <item>
        <title>Borse, Piazza Affari in rialzo. Male Wall Street e Francoforte. Euro giù</title>
        <link>http://feeds.ilsole24ore.com/...</link>
         <description>&lt;b&gt; &lt;font color="#000000"&gt;Sul mercato obbligazionario lo spread BTp-Bund si conferma sopra i 130 punti...&lt;/font&gt;</description>
    <pubDate>Tue, 26 May 2015 14:15:14 GMT</pubDate>
    In questo caso il programma mi ritorna:
    codice:
    Title:Borse, Piazza Affari in rialzo. Male Wall Street e Francoforte. Euro giù
    Link:http://feeds.ilsole24ore.com/...
    Description:<
    PubDate:Tue, 26 May 2015 14:15:14 GMT
    Pensavo che fosse un problema legato alla decodifica dei caratteri speciali, quindi prima di passare il file xml al parse Sax, lo decodifico con i caratteri UTF-8. Ma non ho risolto niente.
    Non so più che cosa fare vi prego datemi un consiglio perchè non mi sembra di aver trovato nulla sui vari forum per risolvere il mio grattacapo.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da unicadani Visualizza il messaggio
    Ma ci sono file xml che sono composti in modo diverso come ad esempio questo:
    codice:
    <item>
        <title>Borse, Piazza Affari in rialzo. Male Wall Street e Francoforte. Euro giù</title>
        <link>http://feeds.ilsole24ore.com/...</link>
         <description><b> <font color="#000000">Sul mercato obbligazionario lo spread BTp-Bund si conferma sopra i 130 punti...</font></description>
    <pubDate>Tue, 26 May 2015 14:15:14 GMT</pubDate>
    Innanzitutto il contenuto di questo description non è testo "puro" ma si vede bene che ci sono tag HTML.

    Il problema principale è il tuo characters. Giusto per precisare, il characters non necessariamente viene invocato una volta sola con tutto il contenuto testuale di un tag. Il parser è libero di spezzare il testo e invocare più volte il metodo characters passando gli spezzoni uno per volta.
    Questo in sostanza vuol dire che in characters non è corretto "settare" subito qualcosa. Dovresti accodare ad un buffer e poi quando hai il tag di chiusura (es. </description>) allora fai qualcosa per settare i dati.

    Una volta che hai il testo completo di un tag, eliminare il markup HTML è facile con una (unica!) regex.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie infinite!
    In effetti potevo arrivarci ragionando, ma molto spesso più teste sono meglio di una!
    Ora usando il buffer funziona correttamente!
    Grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.