Autore Topic: Parse XML  (Letto 723 volte)

Offline adrew

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Parse XML
« il: 02 Luglio 2013, 17:06:22 CEST »
0
Salve a tutti!
Devo fare il parsing di questo codice XML

Citazione
<title>Prova</title>
<link rel="alternate" href="Rabona />
<id>tag:bardellosport.rabona.it,2013-07-02:6613995:Event:1228</id>
<updated>2013-07-02T12:39:43.602Z</updated>
<author>
<name>Andrea Di Maria</name>
<uri>Rabona
</author>
<content type="html">
&lt;p&gt;Ciao&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;Ora:&lt;a href=&quot;Rabona Luglio 2013&lt;/a&gt; presso 18:00 a &lt;a href=&quot;Rabona Luglio 2013&lt;/a&gt; presso 19:00&lt;br/&gt;Luogo:Guidonia&lt;br/&gt;
Via:Bovio 16&lt;br/&gt;
Città:Guidonia Montecelio&lt;br/&gt;
Sito web o mappa:&lt;a href=&quot;https://maps.google.it/maps?q=via+bovio+16&amp;amp;hl=it&amp;amp;ll=41.995573,12.612884&amp;amp;spn=0.009967,0.026157&amp;amp;sll=41.908557,12.535998&amp;amp;sspn=0.31938,0.837021&amp;amp;hnear=Via+Bovio,+16,+Tor+Lupara,+Roma,+Lazio&amp;amp;t=m&amp;amp;z=16&amp;amp;iwloc=A&quot;&gt;https://maps.google.it/maps?q…&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;Rabona class=&quot;xg_sprite xg_sprite-download&quot;&gt;Esporta in Outlook o iCal (.ics)&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;
</content>

Sto utilizzando questa classe come handler

Citazione
package it.rabonamob;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.text.Html;
import android.util.Log;
/**
 * SAX tag handler. The Class contains a list of RssItems which is being filled while the parser is working
 * @author ITCuties
 */
public class RssParseHandler extends DefaultHandler {
 
    // List of items parsed
    private List<RssItem> rssItems;
    // We have a local reference to an object which is constructed while parser is working on an item tag
    // Used to reference item while parsing
    private RssItem currentItem;
    // We have two indicators which are used to differentiate whether a tag title or link is being processed by the parser
    // Parsing title indicator
    private boolean parsingTitle;
    // Parsing link indicator
    private boolean parsingLink;
    private boolean parsingUtente;
    private boolean parsingLinkUtente;
    private boolean parsingDescrizione;
 
    public RssParseHandler() {
        rssItems = new ArrayList<RssItem>();
    }
    // We have an access method which returns a list of items that are read from the RSS feed. This method will be called when parsing is done.
    public List<RssItem> getItems() {
        return rssItems;
    }
    // The StartElement method creates an empty RssItem object when an item start tag is being processed. When a title or link tag are being processed appropriate indicators are set to true.
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                   if ("entry".equals(qName)) {
            currentItem = new RssItem();
        } else if ("title".equals(qName)) {
            parsingTitle = true;
        } else if ("link".equals(qName)) {
            parsingLink = true;
        }
        else if ("name".equals(qName)) {
            parsingUtente = true;
        }
        else if ("uri".equals(qName)) {
            parsingLinkUtente = true;
        }
        else if ("content".equals(qName)) {
            parsingDescrizione = true;
        }
         
    }
    // The EndElement method adds the  current RssItem to the list when a closing item tag is processed. It sets appropriate indicators to false -  when title and link closing tags are processed
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("entry".equals(qName)) {
            rssItems.add(currentItem);
            currentItem = null;
        } else if ("title".equals(qName)) {
            parsingTitle = false;
        } else if ("link".equals(qName)) {
            parsingLink = false;
        }
        else if ("name".equals(qName)) {
            parsingUtente = false;
        }
        else if ("content".equals(qName)) {
            parsingDescrizione = false;
        }
        else if ("uri".equals(qName)) {
            parsingLinkUtente = false;
        }
        Log.d("TAG", "chiudo tag: "+qName);
    }
    // Characters method fills current RssItem object with data when title and link tag content is being processed
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (parsingTitle) {
            if (currentItem != null)
                currentItem.setTitle(new String(ch, start, length));
            parsingTitle=false;
            Log.d("PROVA", "inserisco "+ new String(ch,start,length)+ " come titolo");
           
        }
        else if (parsingLink) {
            if (currentItem != null) {
                currentItem.setLink(new String(ch, start, length));
                parsingLink = false;
                Log.d("PROVA", "inserisco "+ new String(ch,start,length)+ " come link");
            }
        }
        else if (parsingUtente) {
            if (currentItem != null) {
                currentItem.setUtente(new String(ch, start, length));
                parsingUtente = false;
                Log.d("PROVA", "inserisco "+ new String(ch,start,length)+ " come utente");
            }
        }
        else if (parsingLinkUtente) {
            if (currentItem != null) {
                currentItem.setLinkUtente(new String(ch, start, length));
                parsingLinkUtente = false;
                Log.d("PROVA", "inserisco "+ new String(ch,start,length)+ " come linkUtente");
            }
        }
        else if (parsingDescrizione) {
            if (currentItem != null) {
                currentItem.setDescrizione(Html.fromHtml(new String(ch, start, length)).toString());
                parsingDescrizione = false;
                Log.d("PROVA", "inserisco "+ new String(ch,start,length/8)+ " come descrizione");
            }
        }
       }
}

Il problema è che, quando faccio il parsin di elementi che hanno (as esempio) attributi (come CONTENT o come LINK) il parsing mi dà contenuto vuoto... PEr gli altri elementi, mi prende e parsa tutto come si deve.
Come posso risolvere?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parse XML
« Risposta #1 il: 02 Luglio 2013, 19:00:01 CEST »
0
O non hai postato tutto l'xml oppure entry non c'è e quindi currentitem è null.

Se non hai postato tutto l'xml, in che senso da' contenuto vuoto? Salta characters, oppure ci passa ma ch è null, o altro?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline adrew

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:Parse XML
« Risposta #2 il: 02 Luglio 2013, 20:28:08 CEST »
0
Non ho postato tutto il contenuto

Comunque se vedi sul LOG stampo il CH, ed è uno spazio bianco nel caso di link e di content.... mentre se stampo gli altri tag stampa tranquillamente nome utente, nome evento, ecc ecc

Offline zorcraft

  • Utente junior
  • **
  • Post: 108
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    note
  • Play Store ID:
    zorcraft
Re:Parse XML
« Risposta #3 il: 02 Luglio 2013, 22:08:11 CEST »
0
Prova a guardare jsoup e molto semplice come utilizzo e parsa alla perfezzione

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Parse XML
« Risposta #4 il: 03 Luglio 2013, 07:49:27 CEST »
0
Comunque se vedi sul LOG stampo il CH, ed è uno spazio bianco nel caso di link e di content.... mentre se stampo gli altri tag stampa tranquillamente nome utente, nome evento, ecc ecc

Non vedendo cosa loggava ho messo tutte le ipotesi.  :-Pù

Comunque potrebbe essere il feed malformato, per esempio noto adesso che nell'elemento LINK mancano doppi apici alla fine del secondo attributo (oppure è un problema di post sul forum?).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline adrew

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:Parse XML
« Risposta #5 il: 03 Luglio 2013, 15:17:04 CEST »
0
Jsoup parsa solamente html, a me serve parsing XML :P

PS: per il link, dovrebbe essere un problema del forum

Offline zorcraft

  • Utente junior
  • **
  • Post: 108
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    note
  • Play Store ID:
    zorcraft
Re:Parse XML
« Risposta #6 il: 03 Luglio 2013, 15:25:45 CEST »
0
no parsa anche xml io lo uso
l'html e xml con dei tag predefiniti


Offline adrew

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: +1
    • Mostra profilo
Re:Parse XML
« Risposta #7 il: 03 Luglio 2013, 17:43:25 CEST »
0
Diciamo che ho sistemato, con un altro tipo di parser trovato sul sito android.
Ora ho questo problema: ho questa string risultante dal parsing dell' XML
Citazione
<p>Ciao</p><br/><br/>Ora<a href=".....">2 luglio 2013</a> presso 18:00 a <a href"...">5 luglio 2013....

Ed altro ancora dopo. Comunque ho del puro codice HTML che vorrei rendere una stringa vera e propria, ignorando l'html stesso. Come posso fare?
Cioè vorrei si vedesse solo
"Ciao
Ora: 2 luglio 2013 presso 18:00 a 5 luglio 2013..."

Come fare?

EDIT: ho provato
String stampa = Html.fromHtml(StringaInHtml).toString();

mi viene fuori un testo leggibile. Tuttavia per multipli eventi ci mette un po'. Come abbreviare la cosa?
« Ultima modifica: 03 Luglio 2013, 17:46:02 CEST da adrew »

Offline zorcraft

  • Utente junior
  • **
  • Post: 108
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    note
  • Play Store ID:
    zorcraft
Re:Parse XML
« Risposta #8 il: 03 Luglio 2013, 19:08:05 CEST »
0
come fai tu parsi tutto , considera i tag nel tuo caso devi parsare cio che sta nel <p> e nel <a>