From: <da...@ne...> - 2002-07-22 21:08:50
|
I've got the following code in a generic getDocument() method: String driver = "org.exist.xmldb.DatabaseImpl"; Class cl = Class.forName(driver); Database database = (Database)cl.newInstance(); DatabaseManager.registerDatabase(database); org.xmldb.api.base.Collection col = DatabaseManager.getCollection(existURL + "/db/ca/nexicon/projects/" + collectionToGet); XMLResource res = (XMLResource)col.getResource(resourceToGet + ".xml"); SAXHandler handler = new SAXHandler(); // This line is exploding!!!! res.getContentAsSAX(handler); // line 171! return handler.getDocument(); If I instead get the resource content as a string, there are no problems: StringReader inputString = new StringReader(res.getContent().toString()); SAXBuilder saxBuilder = new SAXBuilder(); org.jdom.Document resourceAsDoc = saxBuilder.build(inputString); return resourceAsDoc; The exception I'm getting is: [junit] org.xmldb.api.base.XMLDBException: The name "" is not legal for JDOM /XML elements: XML names cannot be null or empty. [junit] at org.exist.xmldb.XMLResourceImpl.getContentAsSAX(XMLResourceIm pl.java:143) [junit] at SuperClass.getDocument(SuperClass.java:171) My document doesn't have any elements named "", at least not when I retrieve it as a string. Any ideas? Should I be switching parsers somehow? Has anyone else used getContentAsSAX() successfully? I'm using eXist-0.8, Java 1.4.1, Cocoon-2.0.2, Tomcat-4.0.4. Dave |
From: David C. <da...@ne...> - 2002-07-30 17:18:42
|
I'm still getting this error. Since no one replied I assumed either no one else is getting it or no one else has come across it yet. Anyway, I put together a small test program to show the error in action. I also tried it on the latest CVS version. At least I think this is the latest CVS version. It's tagged eXist-0.8 in the repository, but it seemed to have the latest commits, more recent than the 0.8beta build. I'm using the built in Tomcat, Java 1.4.0_01, JDom beta 8 and all other jars from the eXist build. I've tested it on Win2000 and Linux RH7.3 and both get the same error. Here is the error on windows: C:\Documents and Settings\David Cameron\Desktop\dsandbox\existtest>java ExistSAXTest exist://localhost:8080/exist/xmlrpc/db exist://localhost:8080/exist/xmlrpc/db XMLDBException in getDocument(): org.xmldb.api.base.XMLDBException: The name "" is not legal for JDOM/XML elements: XML names cannot be null or empty. at org.exist.xmldb.XMLResourceImpl.getContentAsSAX(XMLResourceImpl.java:144) at ExistSAXTest.getDocument(ExistSAXTest.java:23) at ExistSAXTest.main(ExistSAXTest.java:72) Here is a link to the test program: http://exist-errors.nexicon.ca If someone else could try the program on their installation and let me know if they get the same error? I'd really like to use getContentAsSAX() for performance reasons. Dave |
From: Wolfgang M. <me...@if...> - 2002-08-02 09:55:13
|
I have tried your sample code. So far I have not found a solution, but it= =20 seems that this is actually not a bug in eXist. First, the code works if = I=20 use an embedded instance of eXist by changing the collection URI to=20 xmldb:exist:///db. Second, if you look at the=20 org.exist.xmldb.XMLResourceImpl.getContentAsSAX implementation, you will = see=20 that it first retrieves the XML content via XMLRPC as a string by calling= =20 getContent(), then parses the string using jaxp to generate the SAX strea= m.=20 So I changed your code to do the same thing manually: String content =3D (String)res.getContent(); SAXBuilder sax =3D new SAXBuilder(); Document doc =3D sax.build(new InputSource(new StringReader(content))); XMLOutputter out =3D new XMLOutputter(" "); out.output(doc, System.out); This works. Thus it seems that there is some problem between the SAX pars= er=20 received via javax.xml.SAXParserFactory and the jdom SAXHandler. I have t= ried=20 several alternatives, e.g. using Crimson instead of Xerces: no success. Regards, Wolfgang |