# XML lesen, wenn DTD in anderem Verzeichnis



## Octavian (18. Mrz 2006)

In meinem Programm kann man Daten in eine XML-Datei speichern und laden. 
Laden soll man prinzipiell Daten aus einem beliebigen Verzeichnis können, die DTD für die XML-Datei liegt jedoch im Programmverzeichnis von meiner Anwendung.
Da man die gespeicherten Dateien aber auch verschieben können soll, kann ich in der XML-Datei unter DOCTYPE generell nicht das "richtige" Verzeichnis für die DTD angeben.

Wie kriege ich das jetzt hin, dass der mit beim laden der XML-Datei die DTD automatisch in meinem Programmverzeichnis sucht, und nicht dort, wo die geladene XML-Datei liegt...

Ich benutz grad folgenden Programmcode:


```
DOMParser parser = new DOMParser();
parser.parse(file.getAbsolutePath());
doc = parser.getDocument();
```

"file" wird dabei von einem JFileChooser erzeugt.
Wenn die .dtd-Datei jetzt nicht im selben Verzeichnis ist wie die ausgewählte XML-Datei kommt folgende Exeption:
"C:\...\automaton.dtd (Das System kann die angegebene Datei nicht finden)"

Den Pfad für die dtd-Datei müsste man doch sicher irgendwie auf das Arbeitsverzeichnis des Programms umbiegen können, oder?? Ich finde nur leider net wie...

Schon mal Danke für alle Hilfe 

MfG,
Jan.


----------



## spunti (24. Nov 2006)

Ich habe leider dasselbe Problem und bisher auch keine Lösung gefunden. Ich kann meine XML-Dateien mit DOM nicht parsen, weil die DTD nicht da ist, was mich aber eigentlich gar nicht interessiert. Die Validierung hab ich schon explizit ausgeschalten.

- Hier im Forum gibt's den Tipp, Features an der DocumentBuilderFactory zu setzen. Das scheint aber kein Standard-DOM zu sein, jedenfalls gibts die Methode setFeatures bei mir mit Java 1.4.2 nicht.
- An anderer Stelle im Forum ist jemand aus diesem Grund zum SAX-Parser gewechselt, dort kann man die Beachtung der DTD wohl abstellen. (Leider kann ich SAX aber nicht verwenden, weil ich anscheinend mit Standard-SAX von Java 1.4.2 nicht an XML-Kommentare herankomme.)
- Ein anderer hier im Forum legt die DTD einfach seinem Programm bei und kopiert die an die richtige Stelle, um sie nach dem Parsen wieder zu löschen. Ganz schön freakig, aber im Moment scheint mir das auch die einzige Lösung.

Geht das wirklich nicht abzuschalten oder umzubiegen auf einen anderen Pfad?

danke und grüße
spunti


----------



## spunti (29. Nov 2006)

Ich hab jetzt eine Möglichkeite gefunden, dem DOM-Parser auf die DTD im Verzeichnis meiner Klasse zu verweisen. Das ganze scheint zu funktionieren bei DOCTYPE SYSTEM "<filename>" und bei PUBLIC "<irgendwas>" "<URL>", jdeoch nicht bei SYSTEM "file:<filename>".
(Bei letzterem sucht er immer noch den Pfad wie in der XML-Datei angegeben.)


```
DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			factory.setValidating(false);

			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = null;

			InputSource lala = new InputSource(inputStreamOfExistingFile);
			// use DTD from this class' folder
			URL dtdURL = this.getClass().getResource("jdo.dtd");
			if (dtdURL != null)
				lala.setSystemId(dtdURL.toString());

			document = builder.parse(lala);
```


----------

