Esercizio interazione file xml

di il
12 risposte

Esercizio interazione file xml

Salve a tutti,sono nuovo nel forum per cui piacere di conoscervi. Sto affrontando da un paio di mesi lo studio di java e mi tocca focalizzarmi su questo esercizio per il quale vorrei dei consigli sul come affrontarlo. La mia parte consisterebbe nella creazione dei metodi del suddetto esercizio ma non ho ancora capito benissimo come definirli, potreste aiutarmi? Qui il testo:
Scrivere un programma che gestisce un archivio di qualche tipo(rubrica telefonica, archivio biblioteca) memorizzato in un file XML, il programma dovrà consentire di svolgere operazioni di vario tipo all'archivio (visualizzazione, aggiunta/rimozione e filtraggio di elementi) aggiornando di conseguenza il file xml. Utilizzare il java dom parser per generare un albero che rappresenta la struttura del documento xml.
Potreste aiutarmi? Grazie mille

12 Risposte

  • Re: Esercizio interazione file xml

    Razril ha scritto:


    Utilizzare il java dom parser per generare un albero che rappresenta la struttura del documento xml.
    Questo è il punto essenziale, parsing del XML per ottenere il DOM (Document Object Model). Non puoi quindi usare la tecnica di parsing SAX o StAX, né tecniche di "binding" (es. JAXB).

    Nel framework standard di JavaSE esiste la API JAXP che è uno strato al di sopra di altri parser XML. Dovresti quindi documentarti sull'uso delle classi DocumentBuilderFactory, DocumentBuilder e sulla API nel package org.w3c.dom (vedi javadoc di JavaSE).

    Se vuoi esempi, ne trovi sicuramente in rete. Qui ci sono dei miei "vecchi" esempi su XML, il terzo esempio elencato è quello che ti interessa.
  • Re: Esercizio interazione file xml

    Ti ringrazio! Dopodiché cosa resta da definire oltre l'interazione col xml? Come dovrei continuare oltre?
  • Re: Esercizio interazione file xml

    Razril ha scritto:


    Dopodiché cosa resta da definire oltre l'interazione col xml? Come dovrei continuare oltre?
    Quando si usa l'approccio di parsing XML DOM alla fine del parsing si ottiene un oggetto Document, che rappresenta l'intero documento.
    Nota che qui sto parlando specificatamente della API JAXP e del DOM W3C descritto dal package org.w3c.dom del framework. Non di un'altra libreria di parsing XML che magari ha una API differente ma concettualmente similare.

    In memoria tutto il documento è un grosso "albero" di nodi. Ogni nodo ha figli che sono altri nodi ecc... Ci sono diversi tipi di nodi: nodi di elementi (i tag <qualcosa>), nodi di testo, nodi di commento e altro. Tutto l'albero è "navigabile" in lungo e in largo come vuoi, puoi discendere nei figli, da un nodo puoi risalire ai parenti, ecc...
    Spetta a te analizzarlo ed estrarre e/o modificare le informazioni come vuoi. Nel mio esempio che ti avevo indicato discendevo lungo tutto l'albero cercando gli elementi che mi aspettavo di trovare (es. <book>, <author>) e alla fine componevo un modello ad oggetti più utile cioè un List<Book>.

    Ora .. non so esattamente cosa devi fare tu, se produrre un modello ad oggetti più utile per il tuo lavoro, quindi lo modifichi e poi ri-crei da zero il DOM e lo salvi su file ... oppure se devi modificare direttamente il DOM in qualche modo.
  • Re: Esercizio interazione file xml

    @adbin ha ragione, ma esiste un modo DECISAMENTE piu' comodo da utilizzare per navigare il DOM XML, ed e' usare XPath, che la libreria Java mette a disposizione.

    Anzi, ti diro': ti converrebbe realizzare una libreria mediante indicare QUALE nodo leggere o scrivere usando DIRETTAMENTE un path XPath.

    Se non sai di che cosa sto parlando (plausibile), e' un'occasione per imparare qualcosa di nuovo che usare un milione di altre volte:

    dove gli altri impazziscono scrivendo tonnellate di codice, tu riuscirai a fare la stessa cosa con UNA riga di codice
  • Re: Esercizio interazione file xml

    Ti ringrazio! Potrei contattarti in privato per altre delucidazioni?
  • Re: Esercizio interazione file xml

    migliorabile ha scritto:


    ed e' usare XPath
    @Razril: migliorabile ha detto bene, esiste anche XPath per lavorare con documenti XML. Ma XPath di per sé serve solamente per 1 cosa: rintracciare facilmente e velocemente, tramite una espressione testuale, tutti i nodi di tuo interesse. Cose tipo: "dammi la lista di tutti i nodi <author> che sono sotto tutti i nodi <book>". Ed ottieni la lista senza "navigare" un bel nulla nel documento.

    Con XPath non fai altro di per sé, non modifichi il DOM, non elimini nodi, non aggiungi nodi. XPath fa solo una cosa: "matchare" tutti i nodi che corrispondono ad una certa espressione.
  • Re: Esercizio interazione file xml

    Non necessariamente

    Uno puo' anche crearsi una libreria custom, che supporta un subset dell'XPath (relativamente semplice da fare), con cui ANCHE SCRIVERE/CREARE i nodi che mancano per soddisfare l'espressione

    Ci vuole un po' di spirito di iniziativa, ma una volta realizzata, la creazione del DOM diventa praticamente BANALE.



    Dove la classe non e' acqua
  • Re: Esercizio interazione file xml

    migliorabile ha scritto:


    Uno puo' anche crearsi una libreria custom, che supporta un subset dell'XPath (relativamente semplice da fare), con cui ANCHE SCRIVERE/CREARE i nodi che mancano per soddisfare l'espressione
    Certo, ovvio, si può fare tutto/molto con un po' di tempo e iniziativa. Anche al limite farsi dei metodi di "utilità" facilmente riutilizzabili, del tipo: es. voglio rimuovere comodamente tutti i nodi matchati con XPath, allora si può fare una classe es. DOMUtilities per fare cose del tipo:

    DOMUtilities.xpathRemoveAllNodes(aDocument, "/books/book/author");

    rimuoverebbe tutti gli <author> che sono sotto i <book> sotto la radice <books>. E tutta la logica è nel xpathRemoveAll e quindi riutilizzabile.

    Ma Razril deve fare un "esercizio" per una gestione ben precisa, quindi arrivare a farsi, per dire, un (seppur piccolo) interprete di un subset di XPath probabilmente è 50 volte tanto e quasi sicuramente out-of-scope per lui e l'esercizio.
  • Re: Esercizio interazione file xml

    Ringrazio naturalmente tutti per il supporto. Riguardo L'Ultimo post assolutamente si, alla fine è solo un esercizio considerando sempre che parliamo di primo approccio al linguaggio(iniziato ad ottobre) per cui la soluzione più rapida e indolore farebbe proprio al caso mio, ovviamente nulla toglie che apprendere ulteriori soluzioni sul come avvicinarsi al risultato voluto sia utilissimo, infatti approfondirò poi per conto mio, quindi mi avvalgo sell xpath a quanto ho capito?
  • Re: Esercizio interazione file xml

    Razril ha scritto:


    parliamo di primo approccio al linguaggio(iniziato ad ottobre)
    Cioè ... dopo appena circa 6 mesi siete "già" al parsing e manipolazione di XML??
    Oh mamma .....

    Razril ha scritto:


    quindi mi avvalgo sell xpath a quanto ho capito?
    Se devi trovare velocemente dei nodi, sì. Ma questo non toglie che avuto l'elenco dei nodi matchati con XPath ci possa essere comunque la necessità di fare delle altre operazioni, che potrebbero essere: trovare con XPath altri sotto-nodi usando il nodo corrente i-esimo come "contesto", oppure analizzare comunque una parte di sotto-albero dei nodi in modo tradizionale tramite DOM.

    Insomma, DIPENDE da cosa devi fare di preciso.
  • Re: Esercizio interazione file xml

    andbin ha scritto:


    Razril ha scritto:


    Dopodiché cosa resta da definire oltre l'interazione col xml? Come dovrei continuare oltre?
    Quando si usa l'approccio di parsing XML DOM alla fine del parsing si ottiene un oggetto Document, che rappresenta l'intero documento.
    Nota che qui sto parlando specificatamente della API JAXP e del DOM W3C descritto dal package org.w3c.dom del framework. Non di un'altra libreria di parsing XML che magari ha una API differente ma concettualmente similare.

    In memoria tutto il documento è un grosso "albero" di nodi. Ogni nodo ha figli che sono altri nodi ecc... Ci sono diversi tipi di nodi: nodi di elementi (i tag <qualcosa>), nodi di testo, nodi di commento e altro. Tutto l'albero è "navigabile" in lungo e in largo come vuoi, puoi discendere nei figli, da un nodo puoi risalire ai parenti, ecc...
    Spetta a te analizzarlo ed estrarre e/o modificare le informazioni come vuoi. Nel mio esempio che ti avevo indicato discendevo lungo tutto l'albero cercando gli elementi che mi aspettavo di trovare (es. <book>, <author>) e alla fine componevo un modello ad oggetti più utile cioè un List<Book>.

    Ora .. non so esattamente cosa devi fare tu, se produrre un modello ad oggetti più utile per il tuo lavoro, quindi lo modifichi e poi ri-crei da zero il DOM e lo salvi su file ... oppure se devi modificare direttamente il DOM in qualche modo.
    Devo crearlo da zero il DOM, per cui utilizzo le librerie che hai citato all'inizio giusto? Grazie mille.
  • Re: Esercizio interazione file xml

    Per esigenze lavorative, sviluppai diverse classi: CSV / XML / XLS / TXT / HyperDB / etc., ognuna delle quali può convertire un file di tipo x in un'altro di tipo Y (In realtà il passaggio da un formato all'altro avviene attraverso il passaggio intermedio mediante 'n' ArrayList<>).

    DOM e' un po ostico sui nodi ma una volta studiato si vola.

    Per abbattere il problema del documento gigante in ingresso al parser DOM (Quest'ultimo, a sua volta, lo mette in memoria generando tanti oggetti), la classe XML genera dei subfile temporanei dove vengono memorizzati solo una parte delle informazioni + una gestione interna al SW mediante ArrayList<> come se fosse un'indice. Successivamente parserizzo il sottofile di interesse (come blocchi dati).

    Risultato posso caricare e gestire file di dimensioni oltre il Giga senza avere rallentamenti della JM. E' ovvio che io non devo accedere all'intero documento ma solo a delle sezioni (sottonodi) per volta in lettura/scrittura.

    andBin e migliorabile: Domanda: L'utilizzo esagerato degli ArrayList<> (in alcuni casi ho qualcosa del tipo ArrayList<ArrayList<book>>) può comportare problemi dal punto di vista della JM? Molti mi dicono che è una cosa sporca utilizzare gli arraylist<> come faccio io!! Ma non capisco il perchè o se ci sono effetti collaterali del loro utilizzo!!

    Sono fortemente indeciso se togliere gli arraylist da mezzo e utilizzare l'HyperSQL come sostituto!!

    Voi cosa consigliate?

    Saluti a tutti
Devi accedere o registrarti per scrivere nel forum
12 risposte