Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    47

    Problema nel parsing di un file XML

    Ciao.
    Ho un problema sul codice da scrivere per effetture il parsing di un file xml(con JDOM).
    Ho già creato una classe per il parsing di un file xml con meno tag e funziona..in questo caso il mio problema è "scendere" per ottenere gli elementi che mi interessano.
    il file xml è strutturato così:
    codice:
    <xml>
    <ricetta><descrizione>nome Ricetta</descrizione>
    <ingredienti><ingrediente><nome></nome>
    <numpersone></numpersone>
    </ingrediente>
    <ingredienti>
    </ricetta>
    </xml>
    Ecco,io riesco a scorrere solo fino a ricetta (..e "descrizione")
    e gli elementi che mi interessano sono quelli inseriti in <alimento>.
    Probabilmente ha una risoluzione molto semplice...però io ho davvero tentato in tutti i modi di farlo funzionare!

    codice:
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.lang.*;
    import java.util.*;
    import java.util.List;
    
    import org.jdom.*;
    import org.jdom.input.*;
    
    public class LettoreRicette {
    	
    	 public void LetturaRXML() {
    		 try {
    			 //creiamo la lista in cui inseriremo tutti i dati
    			 List listaa= new ArrayList();
    			 
    			 
    		 SAXBuilder builder = new SAXBuilder();
    		 /*Questo oggetto fornisce il metodo build il quale si occupa di 
    		 effettuare il parsing del file XML passatogli in argomento, e 
    		 di salvarlo in un oggetto Document fornito sempre dalle librerie JDOM.
    		 */
    		 Document document = builder.build(new File("listaricette.xml"));
    		 //otteniamo la radice del documento xml
    		 Element rootElement = document.getRootElement();
    //La classe Element è la classe fondamentale,perchè ci permette di utilizzare le funzionalità del JDOM
    		 
    		 //scorriamo gli elementi figli
    		 List children = rootElement.getChildren(); 
    		 Iterator iterator = children.iterator(); 
    		 //per ogni figlio
    		 while (iterator.hasNext()){ 
    			 Element elericette = (Element)iterator.next(); 
    			 System.out.println("che e' " +  elericette.getName());**questo system.out.println lo uso semplicemente come prova per capire dove sono "arrivato"..in questo caso come output mi scrivere "che e' ricetta"
    			 		
    
    
     } 
    		} catch (JDOMException e) {
    			  System.err.println("Errore nell'utilizzo dei meccanismi JDOM");
    			e.printStackTrace();
    		} catch (IOException e) {
    			  System.err.println("Errore durante la lettura dal file");
    		        
    			e.printStackTrace();
    		}
    	      }
    }
    ciao,grazie.

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

    Re: Problema nel parsing di un file XML

    Originariamente inviato da ypsilonp
    il mio problema è "scendere" per ottenere gli elementi che mi interessano.

    Ecco,io riesco a scorrere solo fino a ricetta (..e "descrizione")
    Il concetto di fondo è semplice: di ogni Element tu puoi prendere la lista dei Node figli e su questi fare altrettanto e così via di seguito ...

    Ma questa ricerca a più livelli la devi fare tu con del codice (ad esempio più metodi ognuno dedicato ad 1 livello) sapendo a priori quale è la struttura del documento! Insomma, il codice devi strutturarlo affinché il "flusso" di esecuzione possa "mimare" la struttura del documento.

    Sei nel Element <ricetta>? Bene, ti aspetti 2 sotto-elementi (da quello che vedo) che sono <descrizione> e <ingredienti>. Prendi tutti i Node figli di <ricetta> e "filtri" solo quelli che sono degli Element e hanno nome "descrizione" o "ingredienti".
    Quando ad esempio hai il Element ingredienti, farai altrettanto, andrai a cercare prima gli <ingrediente> e per ognuno andrai a cercare i sotto-elementi <nome> e <numpersone>.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    47
    Grazie per la risposta..però ho provato in diversi modi a modificiare il codice ma non riesco a scorrere comunque la lista!
    codice:
    import java.io.*;
    import java.util.*;
    
    import org.jdom.*;
    import org.jdom.input.*;
    import org.jdom.output.XMLOutputter;
    
    public class LettoreRicette {
    	 //variabili nella lettura delle ricette
    	  String nomericetta;
    	  int  numpersonericetta;
    	  int quantitaricetta;
    	  int tollricetta;
    	 public void LetturaRXML() {
    
    	    try {
    	      //Creo un SAXBuilder e con esco costruisco un document
    	      SAXBuilder builder = new SAXBuilder();
    	      Document document = builder.build(new File("listaricette.xml"));
    	     
    	      //Prendo la radice
    	      Element root = document.getRootElement();
    	      //Estraggo i figli dalla radice
    	      List children = root.getChildren();
    	      //RICETTA
    	      Iterator iterator = children.iterator();
    	       while(iterator.hasNext()){
    	       Element item = (Element)iterator.next();
    	       System.out.println("che e " +  item.getName());
    	       Element descrizione = item.getChild("descrizione"); 
    	       System.out.println( descrizione.getValue());
    	       Element ingredienti = item.getChild("ingredienti");
    	       Element ingrediente = item.getChild("ingrediente");
    	           //scorriamo la lista
    	       List children2 = item.getChildren();
    	       Iterator iterator2 = children2.iterator();
    	       Element item1 = (Element)iterator2.next();
    	       System.out.println("che e " +  item1.getName());
    	       while(iterator2.hasNext()){       
    	    	   Element nomeali = item1.getChild("nome"); 
               System.out.println( nomeali.getValue());
    	       Element numpersone = item1.getChild("numpersone"); 
    	           System.out.println( numpersone.getValue());
    	           
    	    	   
    	       }
    	
    	             }  
    	    } 
    	    catch (Exception e) {
    	        System.err.println("Errore durante la lettura dal file");
    	        e.printStackTrace();}
    	      }
    }
    La cosa che non riesco a capire,poi,è perchè l'unico output che ottengo è "che è ricette che è ricetta" nonostante io prima richieda l'output dell'elemento "descrizione"(oltre al fatto che vorrei ottenere la "sottolista" ingredienti).
    Grazie ancora,mi dispiace doverti chiedere ulteriori spiegazioni..ma ho provato a modificare senza risultato il tutto molte volte.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Il seguente è un esempio davvero semplice ma significativo con JDOM:

    libri.xml
    codice:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <libri>
      <libro>
        <titolo>The Java Programming Language, 4th Edition</titolo>
        <autori>
          <autore><nome>Ken</nome><cognome>Arnold</cognome></autore>
          <autore><nome>James</nome><cognome>Gosling</cognome></autore>
          <autore><nome>David</nome><cognome>Holmes</cognome></autore>
        </autori>
      </libro>
    
      <libro>
        <titolo>Java and XML, 3rd Edition</titolo>
        <autori>
          <autore><nome>Brett</nome><cognome>McLaughlin</cognome></autore>
          <autore><nome>Justin</nome><cognome>Edelson</cognome></autore>
        </autori>
      </libro>
    </libri>
    LetturaLibri.java
    codice:
    import java.io.*;
    import java.util.*;
    import org.jdom.*;
    import org.jdom.input.*;
    
    public class LetturaLibri {
        public static void main(String[] args) {
            try {
                SAXBuilder builder = new SAXBuilder();
                Document document = builder.build(new File("libri.xml"));
    
                Element elemRootLibri = document.getRootElement();
    
                List listLibro = elemRootLibri.getChildren("libro");
                Iterator iterLibro = listLibro.iterator();
                while (iterLibro.hasNext()) {
                    Element elemLibro = (Element) iterLibro.next();
    
                    System.out.println("--- LIBRO ---");
    
                    Element elemTitolo = elemLibro.getChild("titolo");
    
                    System.out.println("Titolo: " + elemTitolo.getText());
    
                    Element elemAutori = elemLibro.getChild("autori");
    
                    List listAutore = elemAutori.getChildren("autore");
                    Iterator iterAutore = listAutore.iterator();
                    while (iterAutore.hasNext()) {
                        Element elemAutore = (Element) iterAutore.next();
    
                        Element elemNome = elemAutore.getChild("nome");
                        Element elemCognome = elemAutore.getChild("cognome");
    
                        System.out.println("Autore: " + elemNome.getText() + " " + elemCognome.getText());
                    }
                }
            } catch (Exception e) {
                System.err.println(e);
            }
        }
    }
    Come si può vedere la logica di elaborazione del documento, ovvero l'innestamento delle ricerche di elementi specifici e liste di elementi segue, praticamente pari-pari, la struttura del documento.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    47
    Ora funziona.
    ti ringrazio moltissimo per la spiegazione molto chiara!

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.