# Mit JDOM XML Datei auslesen



## haggard (5. Mai 2004)

Hallo!

Ich habe mir einmal euer Tutorial zu JDOM lesen & Schreiben angesehen. An sich ist es ganz gut aber fast ein wenig kurz,

Ich habe zum Beispiel ein kleines Programm geschrieben, es funktioniert aufgrund vieler Fehler noch nicht und ist auch noch nicht fertig.  Aber es geht darum über ein "Öffnen" Dialog eine XML Datei, welche ich zuvor erzeugt habe, wieder einzulesen.  Mein Problem ist nun, wie ich dies bewerkstelligen soll. Es wird im Tutorial und auch in anderen Büchern davon geschrieben, daß die eingelesen Informationen in einen Speicher geschrieben werden. Wie greife ich nun auf diesen Speicher zu? 

Ich habe hier einmal ein paar Ansätze wie ich mir das ganze Vorstelle. Das Programm ist aus der vorherigen Version, in der ich die XML Datei erzeugt habe, enstanden. Daher ist noch einiges an Quelltext davon übrig,

Ich hoffe das ich damit nicht völlig auf dem Holzweg bin, da meine Programmierkenntnisse eher bescheiden sind.


```
package viewer;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;
//import org.jdom.output.*;
import org.jdom.*;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.xml.sax.*;
import java.util.Iterator;

public class viewer 
			extends JFrame 
			implements ActionListener {
  // Definition verschiedener Abstandshalter	
  public static Dimension HGAP10 = new Dimension(10, 1);
  public static Dimension HGAP20 = new Dimension(20, 1); //links
  public static Dimension VGAP20 = new Dimension(1, 20);//oben
  public static Dimension VGAP15 = new Dimension(1, 15);//auswahlboxen
  public static Dimension HGAP30 = new Dimension(30, 1);//Schachfeld links

  
//Erstmaliges f¸llen des zeichnen Panels mit dem speicher
  private void firstpaint() {
	for (int i = 0; i < 5; i++) {
	  for (int j = 0; j < 5; j++) {
		kachel[i][j] = new JLabel();
		(kachel[i][j]).setIcon( (ImageIcon) speicher[i][j]);
		zeichnen.add(kachel[i][j]);

	  }
	}
  }

//erzeugte XML Datei laden und anzeigen
  private void laden() {

	String dateiname = "export";

	try {
	  FileDialog fileDlg = new FileDialog(this, "Datei ˆffnen", FileDialog.LOAD);
	  fileDlg.show();
	  
	  dateiname = fileDlg.getDirectory();
	  dateiname = dateiname.concat(fileDlg.getFile());
	  //Anpassen der Dateiendung an XML
	  if (!dateiname.endsWith(".xml")) {
		char[] temp = dateiname.toCharArray();
		String temp2 = "";
		for (int i = 0; i < temp.length; i++) {
		  if (temp[i] == '.') {
			for (int j = 0; j < i; j++) {
			  temp2 = temp2.concat(dateiname.valueOf(temp[j]));
			}
			break;
		  }
		}
		dateiname = (temp2 == "") ? dateiname : temp2;
		dateiname = dateiname.concat(".xml");

	  }
	}
	catch (NullPointerException n) {
	  System.err.println(n);
	}
	
	//Einlesen mit dem SAX Builder
	//Erzeugen eines neuen JDOM Dokuments an der vorher ausgew‰hlten Datei
	SAXBuilder sxbuild = new SAXBuilder();
	InputSource is = new InputSource(dateiname);
	Document doc = sxbuild.build(is);
	//Lesen des Wurzelelements des JDOM-Dokuments doc
	Element root = doc.getRootElement();
	
	Element grafikPanel = doc.getRootElement(); //Gibt das Root-Element zur¸ck 
	List grafikPanelInfo = grafikPanel.getContent();
	/*Mit der Methode getContent() wird eine Liste mit allen 
	  Elementen und Unterelementen erzeugt*/
	 
	//Mit einem Iterator kann diese Liste durchlaufen werden
	Iterator grafikPanelIterator = grafikPanelInfo.iterator();
	while ( grafikPanelIterator.hasNext() )
 
	{
	  System.out.println( grafikPanelIterator.next().toString() );
	}
 
  }
```

Die XML Datei hat folgendes aussehen:

<?xml version="1.0" encoding="UTF-8"?>
<grafikPanel>
  <kachel>
    <bild>images/reaktor.jpg</bild>
    <x-position>0</x-position>
    <y-position>0</y-position>
  </kachel>
  <kachel>
    <bild>images/12.jpg</bild>
    <x-position>0</x-position>
    <y-position>1</y-position>
  </kachel>
  <kachel>
    <bild>images/13.jpg</bild>
    <x-position>0</x-position>
    <y-position>2</y-position>
  </kachel>

Und die Fehlermeldung die ich ständig bekomme, sehen so aus:

java.lang.Error: Unaufgelˆste Kompilierungsprobleme: 
	Typabweichung: Konvertierung von java.util.List auf java.awt.List nicht mˆglich
	Die Methode iterator() ist f¸r den Typ List nicht definiert (undefined)

	at viewer.viewer.laden(viewer.java:237)
	at viewer.viewer.actionPerformed(viewer.java:303)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1764)
	at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1817)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:419)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:257)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:289)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1113)
	at avax.swing.plaf.basic.BasicMenuItemUI$MouseInputHandler.mouseReleased(BasicMenuItemUI.jaa:943)
	at java.awt.Component.processMouseEvent(Component.java:5134)
	at java.awt.Component.processEvent(Component.java:4931)
	at java.awt.Container.processEvent(Container.java:1566)
	at java.awt.Component.dispatchEventImpl(Component.java:3639)
	at java.awt.Container.dispatchEventImpl(Container.java:1623)
	at java.awt.Component.dispatchEvent(Component.java:3480)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3450)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3165)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3095)
	at java.awt.Container.dispatchEventImpl(Container.java:1609)
	at java.awt.Window.dispatchEventImpl(Window.java:1590)
	at java.awt.Component.dispatchEvent(Component.java:3480)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)


----------



## Christian Fein (5. Mai 2004)

Dein Fehler liegt wohl nicht im XML lesen, sondern:


```
java.lang.Error: Unaufgelöste Kompilierungsprobleme:
Typabweichung: Konvertierung von java.util.List auf java.awt.List nicht möglich
Die Methode iterator() ist für den Typ List nicht definiert (undefined)
```

Du willst eine Instanz einer java.awt.List in eine java.util.List konvertieren, das ist aber nicht möglich.


Bitte nie den gesamten Quellcode posten, sondern nur den betreffenden Teil. Die Zeit sich eine ganze Application anzulesen, hat hier keiner.

setze hier:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.util.List;
davor.

also 
import java.util.List;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


Du solltest sowieso am anfang besser jede Klasse die du benötigst eigenständig imporieren.


----------



## haggard (5. Mai 2004)

Danke erstmal für den Tip. Das hatte ich auch mitbekommen, dass ich den Fehler mit der Konvertierung habe. Ich habe aber nicht gewusst, wie ich den wegbekomme.

Und den Rest den ich da hingeschrieben habe, der ist in Ordnung?  Die Bilder die nämlich in der XML Datei abgespeichert wurden, sollen durch das auslesen, wieder angezeigt werden. Nur weiss  ich auch bisher nicht wie dies zu bewerkstelligen ist.

Danke erst einmal1

P.S.: Ich habe auch noch einmal den Code editiert und das meißte gelöscht. Ich war einfach davon ausgegangen, daß man durch den kompletten Code eher herausfindet, was derjenige damit bezwecken will. Entschuldigung


----------



## Christian Fein (5. Mai 2004)

```
<?xml version="1.0" encoding="UTF-8"?>
<grafikPanel>
<kachel>
<bild>images/reaktor.jpg</bild>
<x-position>0</x-position>
<y-position>0</y-position>
</kachel>
<kachel>
<bild>images/12.jpg</bild>
<x-position>0</x-position>
<y-position>1</y-position>
</kachel>
<kachel>
<bild>images/13.jpg</bild>
<x-position>0</x-position>
<y-position>2</y-position>
</kachel>
```

hier ist noch ein Fehler: 
kein terminiertes Root element 
sprich </grafikPanel> fehlt.


----------



## haggard (5. Mai 2004)

Ist eigentlich kein richtiger Fehler... ich hatte einfach nur die ersten drei Elemente aus der XML Datei kopiert, um mal anschaulich darzustellen, wie meine XML Datei aussieht. In der kompletten Datei steht natürlich ein terminiertes Root Element.

Danke
Haggard


----------

