# document is invalid: no grammar found.



## Guest (30. Mrz 2007)

Hallo, 

ich versuche ein XML-Dokument in eine Xindice XML-Datenbank zu bringen.
Ich erhalte folgende Fehlermeldung.

trying to register database
Exception in thread "main" org.jdom.input.JDOMParseException: Error on line 2 of document file:/c:/build.xml: Document is invalid: no grammar found.
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:465)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:810)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:789)
	at Xml.Testclass.main(Testclass.java:29)
Caused by: org.xml.sax.SAXParseException: Document is invalid: no grammar found.
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
	... 3 more
Caused by: org.xml.sax.SAXParseException: Document is invalid: no grammar found.
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:453)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:810)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:789)
	at Xml.Testclass.main(Testclass.java:29)

Kann mit einer von Euch helfen?

Quellcode liegt bei.

Gruß


```
package Xml;
///db/Eladatenssaetze

import org.jdom.input.SAXBuilder;
import org.w3c.dom.Document;
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;
import java.io.*;

public class Testclass {

public static void main(String[] args) throws Exception {
  Collection col = null;
  
  try {
    String driver = "org.apache.xindice.client.xmldb.DatabaseImpl";
    Class c = Class.forName(driver);

    Database database = (Database) c.newInstance();
    DatabaseManager.registerDatabase(database);
    col =
      DatabaseManager.getCollection("xmldb:xindice://localhost:8080/db/Eladatenssaetze");

    
    Document doc = null;
   
      SAXBuilder b = new SAXBuilder(true);  // validierenden Parser nutzen
      doc = (Document) b.build(new File("c:\\build.xml"));
    
    
    //String data = readFileFromDisk("c:\\build.xml");

    XMLResource document =
      (XMLResource) col.createResource(null, "XMLResource");
    //document.setContent(data);
    document.setContentAsDOM(doc);
    col.storeResource(document);
    System.out.println("Document " + "c:\\build.xml" + " inserted");
  }
  catch (XMLDBException e) {
    System.err.println("XML:DB Exception occured " + e.errorCode);
  }
  finally {
    if (col != null) {
      col.close();
    }
  }
}
```


----------



## SlaterB (30. Mrz 2007)

hast du denn eine Grammatik (DTD?) vorliegen und im Dokument referenziert?

wenn du das nicht brauchst wieso dann
// validierenden Parser nutzen


----------



## Guest (30. Mrz 2007)

Ne habe ich nicht, aber wie soll ich deiner Meinung nach die XML-Datei mit JDOM lesen?

Gruß

Alaska


----------



## SlaterB (30. Mrz 2007)

SAXBuilder b = new SAXBuilder(false statt true); 
? 

ich kenne mich da aber nicht aus


----------



## Guest (30. Mrz 2007)

SlaterB hat gesagt.:
			
		

> SAXBuilder b = new SAXBuilder(false statt true);
> ?
> 
> ich kenne mich da aber nicht aus



Das geht leider nicht.
Ich versuche ja ein XML-Dokument in eine Xindice Datenbank zu schreiben. Ich habe es schon geschafft, aber nur durch Bitweise auslesen der XML-Datei, dieses möchte ich aber verhindern ujnd es über JDom versuchen, kann mir da einer weiterhelfen.


----------



## SlaterB (30. Mrz 2007)

> Das geht leider nicht.

kannst du das der Interesse halber näher erläutern?
wieso gibts denn dann einen boolean-Parameter  ,
was sind die Fehler?

wenn ich hier nur störe, sag Bescheid


----------



## Guest (30. Mrz 2007)

Wieso solltest Du stören?


Hier der Codeausschnitt, den es betrifft.

```
Document doc = null;
    
    SAXBuilder b = new SAXBuilder(false);  // validierenden Parser nutzen
    doc = (Document) b.build(new File("c:\\build.xml")); 
    
    //String data = readFileFromDisk("c:\\build.xml");
    
        XMLResource document =
      (XMLResource) col.createResource(null, "XMLResource");
    document.setContentAsDOM((Node) doc);
   // document.setContentAsDOM(doc);
    col.storeResource(document);
```


Ich erhalte folgende Meldung.

Exception in thread "main" java.lang.ClassCastException: org.jdom.Document cannot be cast to org.w3c.dom.Node
	at Xml.Testclass.main(Testclass.java:36)


Gruß


----------



## Guest (30. Mrz 2007)

Dein Problem liegt darin, das *org.w3c.dom.Document* != *org.jdom.Document*

Die Zeile:

```
Document doc = null;
SAXBuilder b = new SAXBuilder(false);
doc = b.build(new File("c:\\build.xml"));
```
Erzeugt die ein JDom Document, aber bei

```
XMLResource xmlResource =
      (XMLResource) col.createResource(null, "XMLResource");
xmlResource.setContentAsDOM(doc);
```
braeuchtest du ein W3C Document.

Wenn Du das erste in das zweite umwandeln willst, kannst Du


```
import org.jdom.output.DOMOutputter;
import org.jdom.input.SAXBuilder;

org.jdom.Document jDomDoc = ((new) SAXBuilder(false)).build(new File("c:\\build.xml"));
DOMOutputter outputter = new DOMOutputter() ;
org.w3c.dom.Document w3cDoc = outputter.output(jDomDoc);
```
verwenden. 

Du hast aber in dem Moment das JDOM Framework eigentlich nicht wirklich genutzt, es ist fuer deine Zwecke ein unnoetiger Zwischenschritt und Du kannst gleich einen konventionellen XML Parser (z.B. Xerces) verwenden.


----------



## Guest (3. Apr 2007)

So das hat ja so wunderbar geklappt.
Jetzt habe ich nur ein Problem.
Die Datensaetze stehen mit folgenden Namen in der Datenbank.


14f4a7c07c4dac8d00000111b6165bcc

Aber ich möchte das der Name der Datei dort erscheint, in meinem Fall build.xml.

Was muss ich dafür tun?


Gruß


----------



## kleiner_held (3. Apr 2007)

Laut API Doc von xmldb kann man bei

```
col.createResource(null, "XMLResource");
```
anstatt *null* eine vordefinierte ID vergeben. Dabei muss man natuerlich dann selber sicherstellen, dass die gleiche ID nicht mehrmals verwendet wird.


----------

