PDA

View Full Version : [java]lettura da xml


misterxxitalia
20-12-2007, 10:33
ciao a tutti sono nuovo nel mondo della programmazione in java....per motivi scolastici devo realizzare un progetto di una una rubrica.i nominativi (nome cognome ecc...) devono essere caricati e scritti in xml utilizzando le librerie jdom.ora sto cercando di completare la fase di caricamento attraverso dei vettori queste sono le mie classi scritte:
la classe nominativo:

import java.util.*;

public class Nominativo {

private String nome;

private String cognome;

private String indirizzo;

private String telefono;

private String affinita;



public Nominativo (String nome, String cognome, String indirizzo, String telefono, String affinita)

{

this.nome = nome;

this.cognome = cognome;

this.indirizzo = indirizzo;

this.telefono = telefono;

this.affinita = affinita;

}
}

questa è la classe rubrica:
import java.util.*;



class Rubrica

{

private ArrayList<Nominativo> nominativi;



public Rubrica ()

{

nominativi = new ArrayList<Nominativo> ();

}



public void addNominativo (Nominativo n)

{

nominativi.add (n);

}
}

questa è la classe per il caricamento:
import java.util.*;

import java.io.File; // Gestione defi files

import java.io.IOException; // Errori di I/O

import java.io.PrintStream; // Flusso per la stampa

import java.util.Iterator; // Strumento per la scanione di liste

import java.util.List; // Lista di oggetti

import org.jdom.Document; // Documento XML

import org.jdom.Element; // Singolo elemento XML

import org.jdom.JDOMException; // Errori sulla gestione XML

import org.jdom.input.SAXBuilder; // Costruttore di documenti XML

import org.jdom.output.XMLOutputter; // Scrittore di documenti XML



public class XMLRead {

public static void main(String[] args) throws IOException, JDOMException {

//public void errore() throws IOException, JDOMException {//gestione errore....da rivedere!!

Document documento = null;

SAXBuilder builder = new SAXBuilder();// Costruzione di un documeto SAX



//try

//{

documento = builder.build(new File("rubrica.xml"));// Lettura del file XML

//}

//catch (JDOMException ex)

//{

//System.err.println(ex);

//}

//catch (IOException ex)

//{

//System.err.println(ex);

//}

Element rubrica = documento.getRootElement();// Posizionamento sulla root (rubrica)

List nominativi = rubrica.getChildren("nominativo"); // Costruzione della lista con tag "nominativo"

Iterator i = nominativi.iterator();// Uso di un iteratore per scandire la lista

while (i.hasNext()) {// Controllo dell'esistenza di altri elementi nella lista

Element nominativo = (Element) i.next();// Elemento successivo della lista



Rubrica r = new Rubrica ();

Nominativo n1 = new Nominativo (""+nominativo.getChild("nome").getTextTrim(),""+nominativo.getChild("cognome").getTextTrim(),""+nominativo.getChild("indirizzo").getTextTrim(),""+nominativo.getChild("telefono").getTextTrim(),""+nominativo.getChild("affinita").getTextTrim());

r.addNominativo (n1);

System.out.println(n1);

}}}

e questo è il file xml da caricare:

<?xml version="1.0" encoding="UTF-8"?>

<rubrica>

<nominativo>
<nome>Paolo</nome>
<cognome>Rossi</cognome>
<indirizzo>via Marconi 14, Milano</indirizzo>
<telefono>0212345678</telefono>
<affinita>amicone</affinita>
</nominativo>

<nominativo>
<nome>Maria</nome>
<cognome>Bianchi</cognome>
<indirizzo>via Garibaldi 94/A, Torino</indirizzo>
<telefono>01112045678</telefono>
<affinita>conoscente</affinita>
</nominativo>
</rubrica>

in questo file ci sono due nominativi (ce ne potrebbero essere anche 100000)
se io scrivo questo xo...
Nominativo n1 = new Nominativo (""+nominativo.getChild("nome").getTextTrim(),""+nominativo.getChild("cognome").getTextTrim(),""+nominativo.getChild("indirizzo").getTextTrim(),""+nominativo.getChild("telefono").getTextTrim(),""+nominativo.getChild("affinita").getTextTrim());

r.addNominativo (n1);

tutte le propietà (sia di paolo che di maria) finiranno in un nominativo chiamato "n1" quello che voglio io è che le propietà di mario finiscano in "n1" maria in "n2" un tizio che andrò ad aggiungere in "n4" insomma per ogni persona che andrò ad aggiungere lui mi deve creare un n differente!!chi mi sa aiutare??grazie!!

afsdfdlecosdfsfdcco
20-12-2007, 11:20
in questo file ci sono due nominativi (ce ne potrebbero essere anche 100000)
se io scrivo questo xo...
Nominativo n1 = new Nominativo (""+nominativo.getChild("nome").getTextTrim(),""+nominativo.getChild("cognome").getTextTrim(),""+nominativo.getChild("indirizzo").getTextTrim(),""+nominativo.getChild("telefono").getTextTrim(),""+nominativo.getChild("affinita").getTextTrim());

r.addNominativo (n1);

tutte le propietà (sia di paolo che di maria) finiranno in un nominativo chiamato "n1" quello che voglio io è che le propietà di mario finiscano in "n1" maria in "n2" un tizio che andrò ad aggiungere in "n4" insomma per ogni persona che andrò ad aggiungere lui mi deve creare un n differente!!chi mi sa aiutare??grazie!!

Per caricare "n" nominativi devi iterare il contenuto del file xml, cosi':


Element rubrica = ... // questo e' l'elemento "rubrica"

List list = rubrica.getChildren("nominativo"); // ottieni una lista di tutti i figli di "rubrica" che si chiamano "nominativo"

Iterator iterator = list.iterator(); // ottieni un iteratore alla lista

while (iterator.hasNext())
{
Element nominativo = (Element)iterator.next();

r.addNominativo(new Nominativo (""+nominativo.getChild("nome").getTextTrim(),""+nominativo.getChild("cognome").getTextTrim(),""+nominativo.getChild("indirizzo").getTextTrim(),""+nominativo.getChild("telefono").getTextTrim(),""+nominativo.getChild("affinita").getTextTrim()));
}

Spero di essere stato chiaro ^^

edit: qui (http://www.javastaff.com/article.php?story=20060728205624716) trovi un mio piccolo articolo su jdom, magari puo' esserti utile ^^

misterxxitalia
20-12-2007, 11:32
a tu hai creato quella guida??è l'unica guida fatta bene su jdom in italiano!!
scusa perchè...
Element rubrica = ... // questo e' l'elemento "rubrica"

volevi dire che mi devo posizionare sulla root??non capisco quello che hai fatto...poi mi sai dire come faccio(per vedere cosa ho caricato in memoria)a stampare tutto l'arraylist?
ti ringrazio!!

afsdfdlecosdfsfdcco
20-12-2007, 11:43
a tu hai creato quella guida??è l'unica guida fatta bene su jdom in italiano!!

Sisi, e' mia (anche se un po' vecchia ormai ^^)


scusa perchè...
Element rubrica = ... // questo e' l'elemento "rubrica"

rubrica è element??non capisco quello che hai fatto...

Per leggere il file xml ti serve un Builder:

SAXBuilder builder = new SAXBuilder();

Da qui poi con builder.build(new File("file.xml")) ottieni un Document che rapresenta il documento caricato.

Dal Document puoi ottenere la radice del file xml caricato con getRootElement():


Document document = null;
SAXBuilder builder = new SAXBuilder();

document = builder.build(new File("file.xml"));

Element rubrica = document.getRootElement();

...
...




poi mi sai dire come faccio(per vedere cosa ho caricato in memoria)a stampare tutto l'arraylist?
ti ringrazio!!

Anche l'array list supporta gli iterator quindi basta fare cosi':


Iterator<Nominativo> itr = arrayList.iterator();
while (itr.hasNext())
{
System.out.println(itr.next().toString);
}

misterxxitalia
20-12-2007, 12:07
scusa non mi trova l'array da stampare...
import java.util.*;
import java.io.File; // Gestione defi files
import java.io.IOException; // Errori di I/O
import java.io.PrintStream; // Flusso per la stampa
import java.util.Iterator; // Strumento per la scanione di liste
import java.util.List; // Lista di oggetti
import org.jdom.Document; // Documento XML
import org.jdom.Element; // Singolo elemento XML
import org.jdom.JDOMException; // Errori sulla gestione XML
import org.jdom.input.SAXBuilder; // Costruttore di documenti XML
import org.jdom.output.XMLOutputter; // Scrittore di documenti XML

public class XMLRead {
public static void main(String[] args) throws IOException, JDOMException {
//public void errore() throws IOException, JDOMException {//gestione errore....da rivedere!!
Document documento = null;
SAXBuilder builder = new SAXBuilder();// Costruzione di un documeto SAX

//try
//{
documento = builder.build(new File("rubrica.xml"));// Lettura del file XML
//}
//catch (JDOMException ex)
//{
//System.err.println(ex);
//}
//catch (IOException ex)
//{
//System.err.println(ex);
//}
Rubrica r = new Rubrica ();//creo una nuova rubrica

Element rubrica = documento.getRootElement();// Posizionamento sulla root (rubrica)
List list = rubrica.getChildren("nominativo"); // ottieni una lista di tutti i figli di "rubrica" che si chiamano "nominativo"

Iterator iterator = list.iterator(); // ottieni un iteratore alla lista

while (iterator.hasNext())
{
Element nominativo = (Element)iterator.next();

r.addNominativo(new Nominativo (""+nominativo.getChild("nome").getTextTrim(),""+nominativo.getChild("cognome").getTextTrim(),""+nominativo.getChild("indirizzo").getTextTrim(),""+nominativo.getChild("telefono").getTextTrim(),""+nominativo.getChild("affinita").getTextTrim()));
}
Iterator<Nominativo> itr = arrayList.iterator();//stampa array
while (itr.hasNext())
{
System.out.println(itr.next().toString);
}

}}

afsdfdlecosdfsfdcco
20-12-2007, 13:14
scusa non mi trova l'array da stampare...


Il codice con l'array list che ho postato era solo d'esempio!

Il tuo ArrayList e' dentro la classe Rubrica ed e' privato quindi non puoi accederci direttamente. Potresti farti un metodo apposito dentro Rubrica:


public void stampaArrayList()
{
Iterator<Nominativo> itr = nominativi.iterator();
while (itr.hasNext())
{
System.out.println(itr.next().toString);
}
}

misterxxitalia
20-12-2007, 13:34
hai ragione!!xo..
System.out.println(itr.next().toString);
non mi accetta la conversione in stringa!!

afsdfdlecosdfsfdcco
20-12-2007, 14:25
hai ragione!!xo..
System.out.println(itr.next().toString);
non mi accetta la conversione in stringa!!

In Nominativo ridefinisci il metodo toString():


class Nominativo
{
...
...

public String toString()
{
return cognome + " " + nome + " " + indirizzo + ... quello che manca..
}

}

misterxxitalia
20-12-2007, 19:06
scusa ora come richiamo il metodo?se scrivo...
System.out.println(r.stampaArrayList());
non posso xche il metodo è void!

afsdfdlecosdfsfdcco
20-12-2007, 20:32
scusa ora come richiamo il metodo?se scrivo...
System.out.println(r.stampaArrayList());
non posso xche il metodo è void!

Semplicemente r.stampaArrayList() !
Si occupa lui di stampare i dati

misterxxitalia
20-12-2007, 22:31
grazie di tutto!!(mi perdo nelle cazzate!!)

afsdfdlecosdfsfdcco
21-12-2007, 10:31
grazie di tutto!!(mi perdo nelle cazzate!!)

Di niente ^^