# XML Datei einlesen und Elemente ausgeben



## Sophie (8. Jun 2011)

Hallo Zusammen

Ich habe hier ein Programm, dass nicht so ganz richtig funktioniert. Ich kann den Fehler aber leider nicht finden. Kann mir vielleicht jemand weiterhelfen?

Ich denke, es liegt an dieser Zeile:


```
Kontakt kontakt = new Kontakt(null, typ, typ, typ, typ, typ, typ);
```

Aber wenn ich sie umschreiben will, meckert Eclipse

Der Konstruktor sieht so aus:


```
public Kontakt(KontaktTyp pTyp, String pNachname, String pVorname,
            String pStrasse, String pPlz, String pOrt, String pLand) {

        this(null, pTyp, pNachname, pVorname, pStrasse, pPlz, pOrt, pLand);
    }
```

Ich bekomme dann folgende Ausgabe


> Adressdaten für Max Mustermann gefunden!
> Der Kontakt ist an null. Stelle
> Der Kontakt ist null
> Strasse: Musterstrasse
> ...



Es sollte aber folgendermassen sein


> Adressdaten für Max Mustermann gefunden!
> Der Kontakt ist an 2,. Stelle
> Der Kontakt ist privat
> Strasse: Musterstrasse
> ...



Der komplette Quellcode dazu sieht so aus

```
public class MeinAdressbuch {
	
    public static enum KontaktTyp {
        privat, geschaeftlich
    }
    
    //die gespeicherte XML Datei
    private static String XMLDateiName;	
	private static ArrayList<Kontakt> kontakte = new ArrayList<Kontakt>();
	
	
	/**
	 * Konstruktor
	 * @param dataFileName
	 *                    Name der XML-Datei, die die AdressDaten enthält
	 * @throws ParserConfigurationException 
	 * @throws IOException 
	 * @throws SAXException 
	 */
	MeinAdressbuch(String dataFileName) throws ParserConfigurationException, SAXException, IOException {
		XMLDateiName = dataFileName;
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		//Übergebene XML-Datei parsen
		Document dokument = builder.parse(new File(XMLDateiName));
		//DOM Baum durchlaufen und ausgeben
		traversieren(dokument.getDocumentElement(), "");
		}
	
private static void traversieren(Element e, String ebene) {
        
        if (e.getNodeName().equals("Kontakt")) {
        	String typ = e.getAttribute("typ");
        	KontaktTyp kontaktTyp = KontaktTyp.privat;
        	if (typ.equals("geschaeftlich")) {
            	kontaktTyp = KontaktTyp.geschaeftlich;        		
        	}
        	Kontakt kontakt = new Kontakt(null, typ, typ, typ, typ, typ, typ);
           	kontakte.add(kontakt);
           	          	
        }

        // Kindelemente des uebergebenen Elements ermitteln
        NodeList children = e.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node knoten = children.item(i);
            // Knoten ist ein ELEMENT_NODE
            if (knoten.getNodeType() == Node.ELEMENT_NODE) {
            	traversieren((Element) knoten, ebene + " ");
            // Knoten ist ein TEXT_NODE
            } else if (knoten.getNodeType() == Node.TEXT_NODE) {
                String inhalt = knoten.getTextContent();
                if (kontakte.size() > 0) {
                    Kontakt kontakt = kontakte.get(kontakte.size()-1);
                	if (inhalt.trim().length() > 0) {                	
	                	if (e.getNodeName().equals("Vorname")) {
	                		kontakt.setVorname(inhalt);
	                	}
		            	if (e.getNodeName().equals("Nachname")) {
		            		kontakt.setNachname(inhalt);
		            	}
		            	if (e.getNodeName().equals("Strasse")) {
		            		kontakt.setStrasse(inhalt);
		            	}
		            	if (e.getNodeName().equals("Plz")) {
		            		kontakt.setPlz(inhalt);
		            	}
		            	if (e.getNodeName().equals("Ort")) {
		            		kontakt.setOrt(inhalt);
		            	}
		            	if (e.getNodeName().equals("Land")) {
		            		kontakt.setLand(inhalt);
		            	}
	                }
	            }
            } 
        }
    }
	public ArrayList<String> getAlleNamen() {
    	ArrayList<String> namen = new ArrayList<String>();
    	for (int i=0; i<kontakte.size(); i++) {
    		Kontakt kontakt = kontakte.get(i);
    		String vorname = kontakt.getVorname();
    		String nachname = kontakt.getNachname();
    		String nameKomplett = vorname + " " + nachname;
    		namen.add(nameKomplett);			
    	}    	    	
		return namen;
    }
	
	public ArrayList<Kontakt> getAdressenDaten(String vorname, String nachname) {
    	ArrayList<Kontakt> gefundeneKontakte = new ArrayList<Kontakt>();
    	for (int i=0; i<kontakte.size(); i++) {
        	Kontakt kontakt = kontakte.get(i);
        	if (kontakt.getVorname().equals(vorname) || kontakt.getNachname().equals(nachname)) {
        		gefundeneKontakte.add(kontakt);        		
        	}        	    		    		
    	}    	
    	return gefundeneKontakte;
	}
	
	
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException{
	
		MeinAdressbuch meinAdressbuch = new MeinAdressbuch("adressen2.xml");
		System.out.println(meinAdressbuch.getAlleNamen());
		
		// Sucht nach Kontaktdaten für Max Mustermann
		ArrayList<Kontakt> kontakte = meinAdressbuch.getAdressenDaten("Max", "Mustermann");
		for(int i=0; i<kontakte.size(); i++) {
			Kontakt kontakt = kontakte.get(i); 
			System.out.println("Adressdaten für " + kontakt.getVorname() + " " + kontakt.getNachname() + " gefunden!");			
			System.out.println("Der Kontakt ist an " + kontakt.getId() + ". Stelle");
			System.out.println("Der Kontakt ist " + kontakt.getTyp());
			System.out.println("Strasse: " + kontakt.getStrasse());			
			System.out.println("PLZ: " + kontakt.getPlz());			
			System.out.println("Ort: " + kontakt.getOrt());			
			System.out.println("Land: " + kontakt.getLand());		
		}		
	}
}
```


----------



## diggaa1984 (8. Jun 2011)

sieht ein wenig komisch aus die traversieren-methode .. könntest du mal noch den code der Kontakt-Klasse sowie eine kleine Bsp-XML angeben .. damit man mal den Aufbau sieht


----------



## Sophie (8. Jun 2011)

Na klar


```
public class Kontakt {

    public static enum KontaktTyp {
        privat, geschaeftlich
    }

    private String id;
    private KontaktTyp typ;
    private String Nachname;
    private String vorname;
    private String strasse;
    private String plz;
    private String ort;
    private String land;

    public Kontakt(String pId, KontaktTyp pTyp, String pNachname,
            String pVorname, String pStrasse, String pPlz, String pOrt,
            String pLand) {
        setId(pId);
        setTyp(pTyp);
        setNachname(pNachname);
        setVorname(pVorname);
        setStrasse(pStrasse);
        setPlz(pPlz);
        setOrt(pOrt);
        setLand(pLand);
    }

    public Kontakt(KontaktTyp pTyp, String pNachname, String pVorname,
            String pStrasse, String pPlz, String pOrt, String pLand) {

        this(null, pTyp, pNachname, pVorname, pStrasse, pPlz, pOrt, pLand);
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public KontaktTyp getTyp() {
        return typ;
    }

    public void setTyp(KontaktTyp typ) {
        this.typ = typ;
    }

    public String getNachname() {
        return Nachname;
    }

    public void setNachname(String name) {
        this.Nachname = name;
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public String getStrasse() {
        return strasse;
    }

    public void setStrasse(String strasse) {
        this.strasse = strasse;
    }

    public String getPlz() {
        return plz;
    }

    public void setPlz(String plz) {
        this.plz = plz;
    }

    public String getLand() {
        return land;
    }

    public void setLand(String land) {
        this.land = land;
    }

    public String getOrt() {
        return ort;
    }

    public void setOrt(String ort) {
        this.ort = ort;
    }
}
```

[XML]-<Adressbuch> 
    Kontakt typ="privat"> 
        -<Name> <Vorname>Max</Vorname>
         <Nachname>Mustermann</Nachname>
         </Name>
     -<Adresse> 
        <Strasse>Musterstrasse</Strasse>
         <Postleitzahl>12345</Postleitzahl> 
        <Ort>Musterstadt</Ort> 
        <Land>Musterland</Land> 
    </Adresse> 
</Kontakt>[/XML]


----------



## diggaa1984 (8. Jun 2011)

so habs hinbekommen ..

zum ersten wegen der ID: die setzt du bevor du das Element in die Liste addest .. das hattest du schlicht vergessen 

wegen dem KontaktTyP: hier hast du 2 enums deklariert .. nimm das aus der Klasse Adressbuch heraus und beziehe dich nur auf das in der Klasse Kontakt .. dort ist es ja bereits public static

weiterhin hab ich den Konstruktor mit passenden Werten aufgerufen .. das macht dann erstmal:

```
if (e.getNodeName().equals("Kontakt")) {
            String typ = e.getAttribute("typ");
            Kontakt.KontaktTyp kontaktTyp = Kontakt.KontaktTyp.privat;
            if (typ.equals("geschaeftlich")) {
                kontaktTyp = Kontakt.KontaktTyp.geschaeftlich;              
            }
            Kontakt kontakt = new Kontakt(String.valueOf(kontakte.size()+1), kontaktTyp, "", "", "", "", "", "");
            kontakte.add(kontakt);
        }
```

bei der Postleitzahl, hast du nur den falschen Prüfstring angegeben, in der XML und im Source nutzt du 2 verschiedene Strings (PLZ und Postleitzahl)


----------



## Sophie (8. Jun 2011)

Vielen Dank Digga!
Hat mir sehr weitergeholfen


----------

