# Probleme mit Zugriff auf eXist-Datenbank



## Barthi (8. Jun 2005)

Hallo!

Ich möchte eine Java-Anwendung zur Verwaltung von Schacht-Daten erstellen. Zur Speicherung der Daten möchte ich gerne die EXIST-Datenbank benutzen.

Ich hab diese jetzt als Servlet im Tomcat installiert. Funktioniert so weit auch ganz gut.

Hab ne Collection "schaechte" angelegt und zunächst von Hand ein XML-File "Schacht1.xml" reingeladen. Das funktioniert über das Webinterface sehr gut.

Jetzt wollte ich in Java das Dokument auslesen (wie im Retrieve-Beispiel von Exist).

Hier der Code:

```
import javax.xml.transform.OutputKeys;
import org.exist.storage.serializers.EXistOutputKeys;
import org.exist.xmldb.EXistResource;
import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.Database;
import org.xmldb.api.modules.XMLResource;

public class Retrieve {

	protected static String driver = "org.exist.xmldb.DatabaseImpl";

	protected static String URI = "xmldb:exist://localhost:8080/db";

	protected static void usage() {
		System.out.println("usage: org.exist.examples.xmldb.Retrieve collection docName");
		System.exit(0);
	}

	public static void main(String args[]) throws Exception {
		
		String collection = "schaechte";

		// initialize database drivers
		Class cl = Class.forName(driver);
		Database database = (Database) cl.newInstance();
		database.setProperty("create-database", "true");
		DatabaseManager.registerDatabase(database);

		// get the collection
		Collection col = DatabaseManager.getCollection(URI + collection);
		col.setProperty(OutputKeys.INDENT, "yes");
		col.setProperty(EXistOutputKeys.EXPAND_XINCLUDES, "no");
		col.setProperty(EXistOutputKeys.PROCESS_XSL_PI, "yes");
		
		XMLResource res = (XMLResource)col.getResource("Schacht");
		if(res == null)
			System.out.println("document not found!");
		else {
			System.out.println(res.getContent());
			System.out.println("Size: " + ((EXistResource)res).getContentLength());
		}
	}
}
```


Beim Ausführen aus Eclipse heraus bekomm ich dann folgende Fehlermeldung:


```
Fatal error parsing XML: org.xml.sax.SAXParseException: end tag </head> does not match begin tag <meta>
Fatal error parsing XML: org.xml.sax.SAXParseException: end tag </td> does not match begin tag <img>
Fatal error parsing XML: org.xml.sax.SAXParseException: end tag </a> does not match begin tag <img>
Fatal error parsing XML: org.xml.sax.SAXParseException: end tag </td> does not match begin tag <a>
Fatal error parsing XML: org.xml.sax.SAXParseException: end tag </tr> does not match begin tag <td>
Fatal error parsing XML: org.xml.sax.SAXParseException: end tag </table> does not match begin tag <a>
Fatal error parsing XML: org.xml.sax.SAXParseException: attribute name not followed by '='
java.lang.NullPointerException
	at org.exist.xmldb.RemoteCollection.getResource(RemoteCollection.java:290)
	at Retrieve.main(Retrieve.java:39)
Exception in thread "main"
```


Das Programm läuft also bis zu dieser Zeile: XMLResource res = (XMLResource)col.getResource("Schacht");


Ich hab schon mehrere Varianten für die URI versucht. Aber immer kamen irgendwelche Exceptions.

Dann hab ich den Server mal als eigenständiges Programm installiert. Leider mit dem selben Ergebnis.

Mit dem Exist Admin Client kann ich wunderbar Querys auf meine Daten loslassen. Funktioniert so wie es soll.
Aber von Eclipse aus geht's einfach nicht.

Habt Ihr ein paar Tipps für mich? Ich verbringe schon viel zu viel Zeit mit diesem Problem.

Danke,
Barthi


----------



## Roar (8. Jun 2005)

deine xml datei ist fehlerhaft, ich tipp mal dadraut dass du den </meta> end tag vergessen hast.
mich würd interessieren was das fürn cooler parser ist der so schöne fehlermeldungen wirft :?:


----------



## Barthi (8. Jun 2005)

Wow, hier wird ja super schnell geantwortet!!  :toll: 

Also, die XML-Datei sieht folgendermaßen aus:


```
<Schacht id="1">
	<Nummer>M21222</Nummer>
	<Strasse>Kirchplatz</Strasse>
	<Kanal_ID>1</Kanal_ID>
	<Tiefe>
		<Auslauf>2.08</Auslauf>
		<Zulauf1>1.18</Zulauf1>
	</Tiefe>
	<DN>1000</DN>
	<Abdeck_ID>1</Abdeck_ID>
	<Schmutzfaenger>schwer</Schmutzfaenger>
	<Steigeisen>E1211</Steigeisen>
	<Ausgleichsringe>
		<Ausgleichsring>
			<Hoehe>40</Hoehe>
		</Ausgleichsring>
		<Ausgleichsring>
			<Hoehe>60</Hoehe>
		</Ausgleichsring>
		<Ausgleichsring>
			<Hoehe>60</Hoehe>
		</Ausgleichsring>
	</Ausgleichsringe>
	<Schachthals>
		<Hoehe>60</Hoehe>
		<Werkstoff>Stahlbeton</Werkstoff>
	</Schachthals>
	<Schachtringe>
		<Schachtring>
			<Groesse>H1000mm</Groesse>
			<Werkstoff>Stahlbeton</Werkstoff>
		</Schachtring>
	</Schachtringe>
	<Schachtunterteile>
		<Wand>
			<Werkstoff>Stahlbeton</Werkstoff>
			<Form>rund</Form>
		</Wand>
		<Bankett>
			<Werkstoff>Beton</Werkstoff>
			<Hoehe>1/1</Hoehe>
		</Bankett>
		<Gerinne>
			<Werkstoff>AZ</Werkstoff>
		</Gerinne>
	</Schachtunterteile>
	<Zulaeufe>
		<Zulauf_ID>1</Zulauf_ID>
	</Zulaeufe>
	<Auslaeufe>
		<Auslauf_ID>1</Auslauf_ID>
	</Auslaeufe>
	<Schaeden>
		<Schaden_ID>1</Schaden_ID>
		<Schaden_ID>2</Schaden_ID>
		<Schaden_ID>3</Schaden_ID>
	</Schaeden>
</Schacht>
```


Ich kann mir eigentlich nicht vorstellen, dass sie fehlerhaft ist, da ich sie ja, wie gesagt, mit dem Admin Tool und XQuery abfragen kann.


----------



## Roar (8. Jun 2005)

nee da muss nen fehler in ner anderen datei sein. hast du ne html datei oder so die von irgendwem geparst wird?
ich kenn die api da nicht und weiß nich was da sonst noch so gemacht wird :?


----------



## Barthi (8. Jun 2005)

Ich weiß leider auch nicht mehr. Hab Exist noch nie benutzt.

Vielleicht ist es auch einfach die falsche Methode. Aber die kommt aus der Doku und müsste auch für diesen Zweck verwendet werden können.

Naja, vielleicht findet sich ja noch ein Insider  :wink: 


Bis dann,


----------



## Bleiglanz (8. Jun 2005)

ist dir noch nicht aufgefallen, dass da irgendwie ein html-Dokument geparst wird, das nichts mit deiner Datei zu tun hat??

falscher name für die DB oder die Ressource??


----------



## ExElNeT (9. Jun 2005)

Roar hat gesagt.:
			
		

> deine xml datei ist fehlerhaft, ich tipp mal dadraut dass du den </meta> end tag vergessen hast.
> mich würd interessieren was das fürn cooler parser ist der so schöne fehlermeldungen wirft :?:



wenn du ein xml dokument mit dom anhand einer dtd validierst bekommst du solche fehlerausgaben.


----------



## stev.glasow (9. Jun 2005)

@Barthi: Wollte deine Signatur editieren dabei ist mir ein Missgeschick passiert, jetzt heißt du auch stevg  :roll: 
Kannst dich bitte noch mal anmelden, Tschuldigung.
[edit]
So wieder alles in Ordnung, brauchst dich nicht neu Anmelden.


----------



## Guest (9. Jun 2005)

also, ich validieren nichts und ich parse auch keine HTML und transformiere auch nicht mit XSLT oder so.

Das muss also eine Exist-Sache sein.

Die DB-Uri müsste auch stimmen, weil er ja beim debuggen bis zur stelle getResource kommt. D.h. das getCollection scheint zu funktionieren.


----------



## Barthi (13. Jun 2005)

Hi!

Ich hab den Zugriff jetzt hinbekommen. Die Datenbank läuft.

Ich hab jetzt aber das Problem, das ich nicht weiß, wie ich an die NodeValues komme.
Zunächst folgender Code:


```
import javax.xml.transform.OutputKeys;
import org.exist.storage.serializers.EXistOutputKeys;
import org.exist.xmldb.EXistResource;
import org.exist.xquery.functions.xmldb.XMLDBCollection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.Database;
import org.xmldb.api.base.Resource;
import org.xmldb.api.base.ResourceIterator;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.modules.XMLResource;
import org.xmldb.api.modules.XPathQueryService;

public class Test {

	protected static String driver = "org.exist.xmldb.DatabaseImpl";

	protected static String URI = "xmldb:exist://christians.homedns.org:8080/exist/xmlrpc/db/";
	
	public static void main(String args[]) throws Exception {
		
		String sCollection = "schaechte";


		// initialize database drivers
		Class cl = Class.forName(driver);
		Database database = (Database) cl.newInstance();
		database.setProperty("create-database", "true");
		DatabaseManager.registerDatabase(database);
		
        
		// get the collection
		Collection coll = DatabaseManager.getCollection(URI+sCollection,"admin","");
		
		
		coll.setProperty(OutputKeys.INDENT, "yes");
		coll.setProperty(EXistOutputKeys.EXPAND_XINCLUDES, "no");
		coll.setProperty(EXistOutputKeys.PROCESS_XSL_PI, "yes");
		
		//get Resource
		XMLResource res = (XMLResource)coll.getResource("zulauf2.xml");
		
		if(res == null)
			System.out.println("document not found!");
		else {
			System.out.println(res.getContent());
			System.out.println("Size: " + ((EXistResource)res).getContentLength());
		}
		
		Element el = (Element) res.getContentAsDOM();
		System.err.println("ID: "+el.getAttribute("id"));
		NodeList nl = el.getElementsByTagName("Profilart");
		Element el1 = (Element)nl.item(0);
		System.err.println("Value: "+el1.getNodeValue());
```

Ich stelle hier eine Verbindung zur Datenbank her und hole mir die Collection "schaechte". Von der hole ich mir dann das XML "zulauf2.xml".
Davon möchte ich mir gerne die "Profilart" ausgeben lassen. Aber er gibt mir immer nur "null" aus. Wenn ich el1.getNodeName() mache, dann bekomme ich "Profilart". Wenn ich el1.toString() mache, dann bekomme ich <Profilart>rund</Profilart>.

Aber ich möchte nur "rund" auf der Console ausgeben. Das muss doch irgendwie gehen.

Könnt ihr mir helfen??


----------

