# XML Datei einlesen und Elemente in der Console ausgeben



## edfred (19. Aug 2009)

Hallo,

ich mache gerade meine ersten SAX Schritte und bekomme beim einlesen einer XML-Datei immer eine Exception und das egal wie groß die XML-Datei ist. Ich habe keine Ahnung wie ich dieses Problem beheben soll, weil ich keinen Fehler sehe, auch nicht beim debuggen.

Mein simpler Code sieht so aus:

```
import javax.xml.parsers.*;

import org.xml.sax.*;
import org.xml.sax.helpers.*;

import java.util.*;
import java.io.*;

public class XMLTest extends DefaultHandler{
	
	private String filename = "blah.xml";
	private HashMap<Object, Object> services;
	private boolean dtdValidation = false;
	public static void main(String[] args) {
		new ProcessContent();
	}
	
	@Override
	public void startDocument() throws SAXException{
		System.out.println("Begin of Document");
		services = new HashMap<Object, Object>();
	}
	@Override
	public void startElement(String namespaceURI, String localName,
                             String qName, Attributes atts) throws SAXException {
	    
		System.out.println( "namespaceURI: " + namespaceURI ); 
	    System.out.println( "localName: " + localName ); 
	    System.out.println( "qName: " + qName ); 
	    
	    // Attribute ausgeben
        for( int i = 0; i < atts.getLength(); i++ ) {
            System.out.print(" " + atts.getQName(i) + "=\"" + atts.getValue(i) + "\"");
		}
    }
	
	@Override	
	public void endDocument() throws SAXException {
		System.out.println("End of Document");
	}
	    
	public XMLTest() {
		SAXParserFactory parserFactory = SAXParserFactory.newInstance();
		parserFactory.setNamespaceAware(true);
		parserFactory.setValidating(dtdValidation);
		File xmlFile = new File(filename);
		
		try {
			SAXParser parser = parserFactory.newSAXParser();
			parser.parse(xmlFile, new XMLTest());
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}
```

DIe Exception sieht so aus:

```
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Vector.<init>(Vector.java:113)
	at java.util.Vector.<init>(Vector.java:126)
	at java.util.Vector.<init>(Vector.java:135)
	at java.util.Stack.<init>(Stack.java:30)
	at com.sun.org.apache.xerces.internal.xinclude.XIncludeHandler.<init>(XIncludeHandler.java:336)
	at com.sun.org.apache.xerces.internal.parsers.XIncludeParserConfiguration.<init>(XIncludeParserConfiguration.java:155)
	at com.sun.org.apache.xerces.internal.parsers.XIncludeParserConfiguration.<init>(XIncludeParserConfiguration.java:106)
	at com.sun.org.apache.xerces.internal.parsers.JAXPConfiguration.<init>(JAXPConfiguration.java:30)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:125)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl.newSAXParser(SAXParserFactoryImpl.java:98)
	at XMLTest.<init>(XMLTest.java:49)
	at XMLTest.<init>(XMLTest.java:50)
	at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
	at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
	at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
	at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
        at XMLTest.<init>(XMLTest.java:50)
```

Habe auch schon mit -Xms und -Xmx Variablen herumexperimentiert, aber das klappt auch nicht.
Wäre super wenn mir jemand weiterhelfen könnte. Danke schon mal im voraus.

Viele Grüße,
Edfred


----------



## SlaterB (19. Aug 2009)

im Konstruktor von XMLTest in Zeile 50 erzeugst ein weiteres XMLTest-Objekt, also wird nochmal der Konstruktor aufgerufen
-> im Konstruktor von XMLTest in Zeile 50 erzeugst ein weiteres XMLTest-Objekt, also wird nochmal der Konstruktor aufgerufen
-> im Konstruktor von XMLTest in Zeile 50 erzeugst ein weiteres XMLTest-Objekt, also wird nochmal der Konstruktor aufgerufen
-> im Konstruktor von XMLTest in Zeile 50 erzeugst ein weiteres XMLTest-Objekt, also wird nochmal der Konstruktor aufgerufen
-> im Konstruktor von XMLTest in Zeile 50 erzeugst ein weiteres XMLTest-Objekt, also wird nochmal der Konstruktor aufgerufen
-> im Konstruktor von XMLTest in Zeile 50 erzeugst ein weiteres XMLTest-Objekt, also wird nochmal der Konstruktor aufgerufen
...

normalerweise gibts dafür eine StackOverflowException,
du verbrauchst aber irgendwie so viel Speicher, dass der hier vorher zu Ende geht


----------



## edfred (19. Aug 2009)

Danke für die Antwort. Leider verstehe ich das Problem nicht ganz, denn ich rufe den Konstruktor nur ein Mal in der Main-Methode auf. Wie kann er denn dann mehr mals existieren?
Wenn ich das was im Konstruktor steht alles in die Main-Methode packe, dann bekomme ich eine FileNotFound-Exception.
Allerdings ist meine Datei genau da...Also ist das irgendwie wieder nicht nachvollziehbar ???:L


----------



## SlaterB (19. Aug 2009)

Zeile 50 liegt doch eindeutig im XMLTest-Konstruktor?
die main-Methode ist Zeile 14


----------



## edfred (19. Aug 2009)

Ja, ok. Ich hab es geändert...aber jetzt findet der die XML Datei im Dateisystem nicht...
Ein Teufelskreis...Wenigstens verstehe ich die Fehlermeldung jetzt.


----------



## JohannisderKaeufer (21. Aug 2009)

Was passiert wenn du Zeile 50 so 


```
parser.parse(xmlFile, this);
```

änderst?


----------



## edfred (21. Aug 2009)

Sorry, hab vergessen es zu posten. Ich habe das Problem gelöst. als ich

```
file.getAbsolutePath()
```
 aufgerufen habe, hat Java irgendwie einen Ordner im Pfad vergessen. Das habe ich nicht sofort gesehen. Jetzt habe ich den Pfad einfach manuell hinzugefügt und die Methoden der Handler-Klasse in eine eigene Klasse verlagert und es funktioniert. Warum Java nicht den richtigen Pfad angegeben hat ist mir ein Rätsel. Ich benutze Eclipse und Java hat den "src"-Ordner einfach ausgelassen. Dort befindet sich die Java-Dateien und die XML-datei zum parsen.

Vielen Dank für eure Hilfe,
Edfred


----------

