Utilizzo dei file XML in java

  • Il Forum di Tom's Hardware, la più grande community dedicata all'Hardware e all'Informatica. Iscriviti Ora!
#1
Buonasera,

avrei bisogno una mano a gestire una determinata casistica, che è la prima volta che affronto e non so da dove iniziare. Online ho trovato diversi esempi, ma non riesco ad adattarli al mio caso, o quantomeno non ho le idee molto chiare.
Dovrei prelevare da un determinato percorso un file .xml e successivamente, con una INSERT inserire il file all'interno di un campo di tipo CLOB, ma francamente sto avendo qualche difficoltà.
Se per favore qualcuno mi può dare qualche spunto per raggiungere l'obiettivo, ne sarei grato

Grazie a tutti
 
#3
Esatto. Sono bloccato proprio dal fatto che non ho mai usato un tipo CLOB e non so come gestirlo in java.
Riporto una porzione del codice destinata al salvataggio dei dati nel campo CLOB del DB Oracle. Nel mio codice ho generato anche un file di output per vedere se effettivamente mi prelevava qualcosa in input e mi restituiva un output.
Codice:
public FileInputStream scaricaFile(String s1,String s2,String s3)
{

                          Path p=fileOrig.toPath();
                          line=p.toString();
                          
        try {
          
           FileInputStream in=new FileInputStream(line); 
           FileOutputStream out=new FileOutputStream("C:\\Users\\user\\Desktop\\PROVAJAVA\\"+fileOrig.getName()); 
           
           while((c=in.read())!=-1)
            {
                out.write(c);
            }
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }

  return in;
}

public void m_salvaFile(String DBCONN, String DBUSER, String DBPASS, long IDREC) 
    { 
     .......//effettua la connessione del db e preleva le informazioni

 linexml=ScaricaFile.scaricaFile(stringa1,stringa2,stringa3);
String testo = "INSERT INTO NOME_TABELLA (N_XML)values ('?'); //Al posto del ? dovrei sostituire con un dato di tipo CLOB
  .....
}
Come scritto sopra non so come gestire il flusso di byte che ho generato con la FileInputStream per riportare l'xml nel campo CLOB.
Oppure se c'è un esempio facile di gestire questa casistica, anche diverso da quanto scritto sopra, perchè francamente non mi so muovere bene con questo tipo di dati.

Grazie per l'aiuto
Post unito automaticamente:

Buonasera,

dopo diversi tentativi ho trovato un modo di passare dal mio file .xml in un formato stringa. Riporto la porzione di codice che mi permette di fare questa conversione, magari può tornare utile ad altri che si troveranno nel mio caso.
Codice:
/* si crea una factory per parser DOM (costruttori di un DOM a partire da un documento XML */
 DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

/* Questa istruzione commentata attiva il controllo di validazione del documento nei confronti di una DTD */
 //factory.setValidating(true);

 try
 {
       /* la factory crea il parser che viene usato per convertire il  file XML in un DOM */
        DocumentBuilder builder = factory.newDocumentBuilder();

   //Now document contains a DOM representation of my XML document
   document = builder.parse(new File(fileOrig.getAbsolutePath()));
 
// convert Document to String
DOMSource domSource = new DOMSource(document);
       StringWriter writer = new StringWriter();
       StreamResult result = new StreamResult(writer);
       TransformerFactory tf = TransformerFactory.newInstance();
       Transformer transformer = tf.newTransformer();
       transformer.transform(domSource, result);
      System.out.println("contenuto di writer " +writer.toString());
      
 }
 catch(Exception e)
 {
 e.printStackTrace();
 }
Mi rimane da risolvere la scrittura all'interno del DB oracle in un campo di tipo CLOB.
Ho provato a passare la stringa ottenuto dal mio file .xml nella query di INSERT. Non mi viene segnalato nulla dall'IDE, ma quando eseguo compare un errore oracle 1704, praticamente mi dice che la stringa è letteralmente troppo lunga. Effettivamente è presente un campo del file xml lungo. Questo campo rappresenta un certificato di circa 1000 caratteri o poco meno. Comunque molto lungo.
Vi chiedo se devo intervenire in java oppure fare qualche modifica in ORACLE?

Grazie per l'aiuto
 
Ultima modifica:
#4
Dopo diversi tentativi sono riuscito a fare quanto inizialmente chiesto. Riporto di seguito una serie di metodi che permettono la scrittura del file xml in una tabella con campo di tipo CLOB:
Codice:
 public static  Clob prepareFile() throws ApiException, Exception 
    {     
        
        String str=null;  
          
  
         try {
            /**
             * The following line retrieves a stream that is used to write a stream of characters 
             * to the Clob Java object myClob. 
             * The method argument 1 indicates that the Writer object will start writing the stream of characters 
             * at the beginning of the Clob value.
             */
                        Writer clobWriter = myClob.setCharacterStream(1);
            str = ScaricaFile.readFile("C:\\tmp\\nomefile.xml, clobWriter);
      
          myClob.setString(1, str);
     
         
             
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        
        }
         catch(Exception ex){
             System.out.println("generica exception in caricaClob "+ex.getMessage());
       
         }      
    return myClob;
          
    }

    /**
     * writes this stream of characters; the stream is from the file specified by the String fileName. 
     * method reads the file line-by-line specified by the file fileName and writes it to the Writer 
     * object specified by writerArg.
     * @param fileName
     * @param writerArg
     * @return 
     */
    private static String readFile(String fileName, Writer writerArg)
       {

    BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(fileName));
            String nextLine = "";
            StringBuffer sb = new StringBuffer();
            while ((nextLine = br.readLine()) != null) {
              //  System.out.println("Writing: " + nextLine);
                writerArg.write(nextLine);
                sb.append(nextLine);
            }       // Convert the content into to a string
            String clobData = sb.toString();
            // Return the data.
            return clobData;
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        catch(Exception ex){
             System.out.println("generica exception in readFile "+ex.getMessage());
         }
        return null;
       }


public void main(){
try {
//            
            pstmt = dbcon.prepareStatement(par1);
                pstmt.setClob(1, this.getMyClob());
                pstmt.executeUpdate();
               dbcon.commit();
            
        } 
               catch (SQLException ex) 
               {          
                 dbcon.rollback();
                 return ("4"+"!"+String.valueOf(ex.getErrorCode())+"!"+ex.getMessage());
               
        }
}