Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [JAVA] Parser Sax

  1. #1

    [JAVA] Parser Sax

    Ciao a tutti,

    mancano pochi passi e poi ho finito la mia applicazione, anche grazie al vostro aiuto...aiuto che chiedo ancora una volta...

    Allora nella mia applicazione ho una funzione di Import che attraverso un jFileChooser prende in input un file xml e chiama il parser per leggerlo...

    Il parser è una parser SAX implementato così:

    codice:
    public class Parser
        extends DefaultHandler {
    
      private static int INDENT = 2;
    
      public void parse(File file) {
        try {
          SAXParserFactory parserFactory = SAXParserFactory.newInstance();
          parserFactory.setValidating(false);
          parserFactory.setNamespaceAware(false);
          SAXParser parser = parserFactory.newSAXParser();
          parser.parse(file, this);
        }
        catch (IOException exception) {
          JOptionPane.showMessageDialog(null, exception.getMessage(),
                                          "I/O Exception",
                                          JOptionPane.ERROR_MESSAGE);
        }
    
        catch (SAXException exception) {
          JOptionPane.showMessageDialog(null, exception.getMessage(),
                                          "SAX Exception",
                                          JOptionPane.ERROR_MESSAGE);
        }
    
        catch (ParserConfigurationException exception) {
          JOptionPane.showMessageDialog(null, exception.getMessage(),
                                          "Parser Configuration Exception",
                                          JOptionPane.ERROR_MESSAGE);
        }
    
        catch (FactoryConfigurationError exception) {
          JOptionPane.showMessageDialog(null, "None Row Selected",
                                          "Factory Configuration Error",
                                          JOptionPane.ERROR_MESSAGE);
        }
    
      }
    
      private int idx = 0;
    
    
     public void characters(char[] ch, int start, int length) {
        String s = new String(ch, start, length);
       if (!s.startsWith("\n"))
         System.out.println(getIndent() + " Value: " + s);
    
      }
    
      public void endDocument() {
        idx -= INDENT;
        System.out.println(getIndent() + "end document");
        System.out.println("...PARSING ends");
    
      }
    
      public void endElement(String url, String localName, String qName) {
        System.out.println(getIndent() + "end element");
        idx -= INDENT;
    
      }
    
      public void startDocument() {
        idx += INDENT;
        System.out.println("PARSING begins...");
        System.out.println(getIndent() + "start document: ");
    
      }
    
      public void startElement(String uri, String localName, String qName,
                               Attributes attributes) {
    
        idx += INDENT;
        System.out.println('\n' + getIndent() + "start element: " + qName);
    
      }
    
      private String getIndent() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < idx; i++)
          sb.append(" ");
        return sb.toString();
      }
    
    }
    Ora tutto questo funziona, ma io vorrei riuscire a salvare i dai contenuti nel file xml nel mio database.

    Per esempio:
    Quando il parser trova il tag <title> il valore di title deve essere letto e salvato nelle colonna title del mio database.

    N.B le funzioni di inserimento in database le ho già implementate, devo solo capire come funziona questo benedetto parser...i dati me li salva in una struttura o no?

    Grazie per l'aiuto.
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Parser Sax

    Originariamente inviato da vespaslight125
    devo solo capire come funziona questo benedetto parser...i dati me li salva in una struttura o no?
    Ovviamente no. (e se hai scritto/provato del codice avrei supposto che hai capito il concetto di un parser SAX....)

    Il parser SAX legge il documento XML e di tanto in tanto ti informa chiamando i vari metodi startDocument, startElement, ecc.... In pratica ti dice: "guarda che c'è l'inizio del documento" ..... "guarda che c'è l'apertura di un tag XYZ" .... "guarda che ci sono dei caratteri" .... "guarda che c'è la chiusura di un tag XYZ" ..... ecc....

    Cosa ne fai di queste "notifiche" lo devi stabilire tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Infatti come immaginavo...uff...

    ok...allora...come risolvo il mio problema???

    Quando mi trova il tag (ad esempio <title>) poi va a chiamara la funzione characters che legge carattere per carattere...come faccio a dirgli di inserire quel testo nella colonna giusta?
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vespaslight125
    ok...allora...come risolvo il mio problema???
    Ad esempio usare l'altro parser DOM. Se usare SAX o DOM è ovviamente da valutare attentamente, ci sono vantaggi/svantaggi per ognuno.

    Originariamente inviato da vespaslight125
    Quando mi trova il tag (ad esempio <title>) poi va a chiamara la funzione characters che legge carattere per carattere...come faccio a dirgli di inserire quel testo nella colonna giusta?
    Volendo usare SAX, tieni una variabile di istanza di tipo StringBuilder. Quando ricevi la notifica della apertura di un tag, azzeri il contenuto dello StringBuilder. Quando ricevi caratteri farai una cosa del genere:
    codice:
    public void characters (char[] buf, int offset, int len)
        throws SAXException
    {
        sb.append (str, offset, len);
    }
    Tieni presente che non sai a priori quanti caratteri ti vengono passati volta per volta (quindi non bisogna fare alcun tipo di assunzione). Dipende da come il parser legge il documento xml.

    Quando ricevi la notifica della chiusura di un tag, ottieni quindi una String dallo StringBuilder e ne fai quello che vuoi. Questo modo di operare presuppone che un tag contenga solo dati e non ulteriori tag. Che succede se si volesse gestire una cosa del tipo?

    <title>
    Esempio di <bold>titolo</bold>
    </title>

    Beh, è ovviamente da gestire in modo appropriato e nel caso sopra dovresti innanzitutto stabilire cosa farci con il tag 'bold'. Insomma, SAX ti informa solamente di cosa incontra man mano nel documento. Cosa prendere e come trattare queste informazioni, è un problema del programmatore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ok forse è meglio usare il DOM allora...per una questione di forma più che altro...avevo usato il Sax perchè mi sembrava più rapido, ma non avevo notato che non salvava la struttura dei file "parsati"!

    Cerco un esmpio di parser Dom...se hai un link a cui riferirsi ti ringrazio...altrimenti vedo di arrangiarmi, almeno per ora...

    Grazie
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vespaslight125
    Cerco un esmpio di parser Dom...se hai un link a cui riferirsi ti ringrazio...altrimenti vedo di arrangiarmi, almeno per ora...
    Ad esempio questo che ho scritto io:

    codice:
    import java.lang.*;
    import java.io.*;
    import javax.xml.parsers.*;
    import org.xml.sax.*;
    import org.xml.sax.helpers.*;
    
    
    public class XmlSaxTester extends DefaultHandler
    {
        private File file;
        private int level;
    
        public XmlSaxTester (String filename)
        {
            file = new File (filename);
        }
    
        public void load ()
        {
            try
            {
                SAXParserFactory factory = SAXParserFactory.newInstance ();
                SAXParser saxParser = factory.newSAXParser ();
    
                level = 0;
                saxParser.parse (file, this);
            }
            catch (SAXException sxe)
            {
                Exception x = sxe;
    
                if (sxe.getException () != null)
                   x = sxe.getException ();
    
                x.printStackTrace ();
            }
            catch (ParserConfigurationException pce)
            {
                pce.printStackTrace ();
            }
            catch (IOException ioe)
            {
                ioe.printStackTrace ();
            }
        }
    
        public void startDocument ()
            throws SAXException
        {
            System.out.println ("---- Start of document ----");
        }
    
        public void endDocument ()
            throws SAXException
        {
            System.out.println ("---- End of document ----");
        }
    
        public void startElement (String namespaceURI, String lName, String qName, Attributes attrs)
            throws SAXException
        {
            printIndentation ();
    
            System.out.println ("Start of element \"" + qName + "\"");
    
            for (int a = 0; a < attrs.getLength (); a++)
            {
                String attrName = attrs.getQName (a);
                String attrValue = attrs.getValue (a);
    
                /* Print attribute name/value */
                printIndentation ();
                System.out.println ("Attribute \"" + attrName + "\"=\"" + attrValue + "\"");
            }
    
            level++;
        }
    
        public void endElement (String namespaceURI, String lName, String qName)
            throws SAXException
        {
            level--;
    
            printIndentation ();
    
            System.out.println ("End of element \"" + qName + "\"");
        }
    
        public void characters (char[] buf, int offset, int len)
            throws SAXException
        {
            boolean quote = false;
    
            printIndentation ();
    
            System.out.print ("Characters ");
    
            while (len-- > 0)
            {
                if (Character.isWhitespace (buf[offset]))
                {
                    if (quote)
                    {
                        quote = false;
                        System.out.print ("\" ");
                    }
    
                    System.out.print ("0x" + Integer.toString (buf[offset], 16) + " ");
                }
                else
                {
                    if (!quote)
                    {
                        quote = true;
                        System.out.print ("\"");
                    }
    
                    System.out.print (buf[offset]);
                }
    
                offset++;
            }
    
            if (quote)
                System.out.print ("\"");
    
            System.out.println ();
        }
    
    
        private void printIndentation ()
        {
            for (int l = 0; l < level; l++)
                System.out.print ("    ");
        }
    
    
        public static void main (String[] args)
        {
            if (args.length == 1)
            {
                XmlSaxTester tester = new XmlSaxTester (args[0]);
    
                tester.load ();
            }
            else
            {
                System.out.println ("Usage: XmlSaxTester <xml file>");
            }
        }
    }
    Se hai un documento come questo:

    codice:
    <?xml version="1.0"?>
    <example>
      <title lang="en">
        Hello world!
      </title>
    </example>
    ti stampa:

    codice:
    ---- Start of document ----
    Start of element "example"
        Characters 0xa 0x20 0x20
        Start of element "title"
        Attribute "lang"="en"
            Characters 0xa 0x20 0x20 0x20 0x20 "Hello" 0x20 "world!" 0xa 0x20 0x20
        End of element "title"
        Characters 0xa
    End of element "example"
    ---- End of document ----
    È sicuramente utile per capire cosa succede e cosa fornisce il parser SAX.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ma questo è SAX??? mmm ora vediamo...
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vespaslight125
    Ma questo è SAX???
    Perché il dubbio? Uso SAXParserFactory/SAXParser.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Eccomi di nuovo...alla fine sto valutando se usare JDOM e ho trovato questo articolowww.mokabyte.it/2002/10/jdom.htm che dici potrebbe semplificarmi le cose?

    Sarà possibile fare in modo che i tag vengano rilevati in automatico ad ogni lettura senza doverli impostare?



    Non so se mi sono spiegato...
    Nerviamo nel cuore la Gnocca sempre, ma in Testa e sotto il Culo la Mia VESPA!!!

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.