Newsgroup: it.comp.java
Titolo: Cosa non va in questo paser?

Allora il mio parser fa semplicemente questo :
public class ParserXML extends DefaultHandler {
        ..........
        .........
        ..........
   public void createParser(String file) {
          try {
                   ClassPathResource pathRes = new ClassPathResource(file);
                   XMLReader xr = 
XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
                   xr.setContentHandler(this);
                   xr.setErrorHandler(this);
                   xr.parse(new InputSource(pathRes.getInputStream()));
          } catch (SAXException se) {
                .................
          } catch (FileNotFoundException fe) {
                ..................
          } catch (IOException ioe) {
                .................
          }
    }
    Riscrivo i metodi startElement e end Element
    e poi :
   public void characters (char ch[], int start, int length){
         String value = "";
         for (int i = start; i < start + length; i++) {
                if (ch[i] != '\n' )
                    value = value + ch[i];
         }
            .....................
  }
Il  problema è che su file di grosse dimensioni (devo parserizzare file di 
quasi 10.000 righe)
va tutto a puttane senza un motivo valido.
Credo che il problema sia nel metodo characters ma non riesco a capire il 
problema.
Ad esempio se ho un tag del genere :
<TEST>TESTO DA VISUALIZZARE</TEST>
il metodo characters torna "A VISUALIZZARE" troncandomi la parte iniziale.
Tutto questo accade solo su file di grosse dimensioni.
-- 
Magnt Quisht! 

 
Bravo, hai un ottimo fiuto! Un po' di tempo fa ho corretto lo stesso 
problema nel codice di un mio collega.
Il problema è che il metodo characters non garantisce di passarti tutti 
i caratteri del nodo di testo, cito dai Javadoc org.xml.sax.ContentHandler:
"[...] SAX parsers may return all contiguous character data in a single 
chunk, or they may split it into several chunks"
Soluzione: devi creare una variabile membro di tipo StringBuffer e in 
characters() vi aggiungi i caratteri che ti vengono passati.
I tuoi problemi spariranno...puff
-- 
  -- + Setaceous Pig + --
http://www.megadix.org/
http://www.jroller.com/page/megadix/

 I tuoi problemi spariranno...puff
Cioč se scrivo cosě funziona?? :
    public void characters (char ch[], int start, int length){
         StringBuffer value = new StringBuffer();
         for (int i = start; i < start + length; i++) {
              if (ch[i]!='\n' && ch[i]!='\t'){
                   value = value.append(ch[i]);
              }
         }
         this.setBeanProperty(value.toString());
    }
Cosa cambia?
-- 
Magnt Quisht! 

 
No. Allora, vediamo un po'...
Variabile membro = variabile dichiarata all'interno della classe
private StringBuffer value;
startElement(String uri, String localName, String qName,
              Attributes attributes) {
   // esempio di condizione in cui bisogna inizializzare lo StringBuffer:
   if (qName.equals("quello che ti serve")) {
     value = new StringBuffer();
   }
   else {
     ....
   }
   ...
}
...
   public void characters (char ch[], int start, int length){
     for (int i = start; i < start + length; i++) {
       if (ch[i]!='\n' && ch[i]!='\t'){
         value = value.append(ch[i]);
       }
     }
   }
...
}
Mi raccomando, cerca di capire dove devi inizializzare lo StringBuffer, 
altrimenti ti ritrovi con uno stringone insignificante (o un bel 
NullPointerException ...)



Si giusto.
In effetti ho scritto il codice cosě come me lo hai riportato adesso.
Quello che non capisco č :
Cosa cambia rispetto all'utilizzo di una stringa normale?
A me sembra tutto uguale.
-- 
Magnt Quisht!