citazioni di analisi dei problemi con SAX parser (javax.xml.parsers.SAXParser) su Android API 1.5

StackOverflow https://stackoverflow.com/questions/2573542

  •  24-09-2019
  •  | 
  •  

Domanda

Quando si utilizza un parser SAX, l'analisi non riesce quando c'è un "nel contenuto del nodo. Come posso risolvere questo? Ho bisogno di convertire tutti i" personaggi?

In altre parole, ogni volta che ho un preventivo in un nodo:

 <node>characters in node containing "quotes"</node>

Tale nodo viene macellata in più array di caratteri quando il gestore di sta analizzando esso. È questo un comportamento normale? Perché le citazioni dovrebbero causare un tale problema?

Ecco il codice che sto usando:

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

 ...


HttpGet httpget = new HttpGet(GATEWAY_URL + "/"+ question.getId());
          httpget.setHeader("User-Agent", PayloadService.userAgent);
          httpget.setHeader("Content-Type", "application/xml");

          HttpResponse response = PayloadService.getHttpclient().execute(httpget);
          HttpEntity entity = response.getEntity();

          if(entity != null)
          {        
              SAXParserFactory spf = SAXParserFactory.newInstance();
              SAXParser sp = spf.newSAXParser();            
              XMLReader xr = sp.getXMLReader();            

              ConvoHandler convoHandler = new ConvoHandler();
              xr.setContentHandler(convoHandler);             
              xr.parse(new InputSource(entity.getContent()));                                


              entity.consumeContent();         

               messageList = convoHandler.getMessageList();


          }
È stato utile?

Soluzione

L'errore è nel vostro gestore di classe si fa riferimento nella vostra più recente commento.

Un errore comune a scrivere un ContentHandler è quello di assumere il metodo di caratteri è solo andare a essere chiamata una volta con tutti i dati dei personaggi. Può infatti essere chiamato più volte con pezzi dei dati di carattere, che si deve raccogliere. Il sminuzzare in più array di caratteri è un comportamento normale.

Probabilmente è necessario avviare un collettore (forse uno StringBuffer) nel metodo startElement, Raccogliere i dati in esso nel metodo personaggi e poi utilizzare i dati nel metodo endElement, che dovrebbe essere dove le message.setText mostrati nel tuo commento si chiama.

Altri suggerimenti

Risposta corretta è già stato dato (WRT garanzie nella dati di caratteri inviati come singolo evento). Una cosa da considerare è che magari utilizzando un parser con Stax (o xmlpull) Interfaccia "pull" avrebbe funzionato meglio; c'è un modo per forzare Stax parser per garantire che tutti i dati char è segnalato come unico token (abilitare coalescenza). Stax (o parser tiro in genere) sono considerati uso po 'più conveniente di SAX, e ci sono implementazioni che girano su Android così (Android SDK anche fasci xmlpull credo); Woodstox e Aalto dovrebbero funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top