Hi Everyone! First of all I'd like to apologize to everyone who receives this mail twice, as I've already posted this question to [EMAIL PROTECTED] The reason for the cross-posting is that I haven't received any replies on the above mentioned list in the last two days, and the problem is getting urgent. Also the question may be relevant for both lists (as I don't know whether the problem lies in Tomcat or in Xerces-J).
So my problem is described in the following message: ----- Forwarded message from ----- To: [EMAIL PROTECTED] Subject: Validating with an XML Schema in a JSP Hi Everyone! I really hope someone on this list has some answers for me, because this JSP issue is driving me mad... Environment: Tomcat 4.0.4 - fixed, cannot upgrade it. JDK 1.3.1_02 - fixed, cannot upgrade it. Xerces 2.5.0 - the latest official release. I'm trying to develop a JSP to upload an XML file, validate it against a given XML Schema and create a DOM from it. The upload is started from a simple HTML form, which calls my JSP. The uploaded XML file is the simplest possible - XML 1.0, no namespaces, no DTD or Schema included. I have 'xercesImpl.jar' and 'xml-apis.jar' in my WEB-INF/lib directory, and any other classes I need in my WEB-INF/classes directory. I also put the XSD file into the WEB-INF/classes directory and use my own EntityResolver class to load it as a resource. The JSP source code is the following: -----------------------------------JSP source -------------------------------- <%@ page language="java" import="com.jspsmart.upload.*, org.w3c.dom.Document, org.apache.xerces.parsers.DOMParser, dca.store.BranchDetailsErrorHandler, dca.store.XSDResolver, java.io.StringReader, org.xml.sax.InputSource, org.xml.sax.SAXNotRecognizedException, org.xml.sax.SAXNotSupportedException, org.xml.sax.SAXException, java.io.IOException, java.io.InputStream" %><jsp:useBean id="smartUploader" scope="page" class="com.jspsmart.upload.SmartUpload" /><html> <head> <title>Uploading branch details XML</title> </head> <body onload="parent.steps.highlight (2)"> <% final String EXTERNAL_NONAMESPACE_SCHEMA_LOCATION = "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation"; final String BRANCH_SCHEMA = "branch.xsd"; final String XML_NAMESPACES = "http://xml.org/sax/features/namespaces"; final String XML_VALIDATION = "http://xml.org/sax/features/validation"; final String XML_SCHEMA_VALIDATION = "http://apache.org/xml/features/validation/schema"; String xmlContent = ""; Document xmlDocument; String error = null; try { smartUploader.initialize (pageContext); smartUploader.setTotalMaxFileSize (102400); smartUploader.upload (); // Printing the uploaded XML file into an HTML comment for debugging purposes out.println ("<!--"); xmlContent = smartUploader.getFiles ().getFile (0).getContentString (); out.println (xmlContent); out.println ("-->"); } catch (IllegalArgumentException iax) { error = "No file was uploaded."; } if (error == null) { try { DOMParser parser = new DOMParser (); BranchDetailsErrorHandler errorHandler = new BranchDetailsErrorHandler (); XSDResolver xsdResolver = new XSDResolver (); // Printing the contents of branch.xsd into an HTML comment for debugging purposes InputStream is = xsdResolver.resolveEntity ("", "branch.xsd").getByteStream (); StringBuffer str = new StringBuffer (); byte b[] = new byte[1]; while (is.read (b) != -1) { str.append (new String (b)); } is.close (); out.println ("<!--"); out.println (str); out.println ("-->"); parser.setProperty (EXTERNAL_NONAMESPACE_SCHEMA_LOCATION, BRANCH_SCHEMA); parser.setFeature (XML_NAMESPACES, false); parser.setFeature (XML_VALIDATION, true); parser.setFeature (XML_SCHEMA_VALIDATION, true); parser.setErrorHandler (errorHandler); parser.setEntityResolver (xsdResolver); InputSource xmlSource = new InputSource (new StringReader (xmlContent)); parser.parse (xmlSource); out.println (xsdResolver.getSystemIds () + "<br/>"); if (errorHandler.isValidDocument ()) { xmlDocument = parser.getDocument (); out.println ("Document root element: " + xmlDocument.getDocumentElement ().getTagName ()); } else { error = "Invalid XML document: " + errorHandler.getMessage (); } } catch (SAXNotRecognizedException nre) { error = "Cannot parse document."; } catch (SAXNotSupportedException nse) { error = "Cannot parse document."; } catch (SAXException se) { error = "Invalid XML document: " + se.getMessage (); } catch (IOException ioe) { error = "Cannot parse document."; } } if (error != null) { out.println (error); } else { out.println ("No errors."); } %> </body> </html> ----------------------------------------- End JSP source --------------------- Details: - The jspsmart.upload classes are free classes from www.jspsmart.com, which simplify the process of extracting the uploaded files from the HTTP header. - BranchDetailsErrorHandler is my own parser error handling class. It ignores warnings, stores the information from errors and fatal errors, and on error or fatal error flips a boolean 'valid' value to false. The isValidDocument () method returns this value, and the getMessage () method returns the saved error details. - XSDResolver is my own EntityResolver class. On each resolveEntity call it stores the parameters, and if the systemId parameter is 'branch.xsd' then loads the 'branch.xsd' file as a resource and returns it. The getSystemIds () method returns all the call parameters as a String. - As you can see I print the contents of both the uploaded XML file and the resource XSD file into the page in HTML comments - both work fine. The problem: - If I use the same code in a simple Java application then everything works flawlessly. The files are loaded, the XML is validated against the XSD and the Document object is created without any problems. (The validation works as it should - I've checked.) - The same code in JSP however insists that the XML is not valid. The errorHandler object is called with an error, and what's even more strange, the error comes from the same place in the XML file. For example if I add one more empty line to the XML file, the error message changes accordingly. (And yes, I've checked, the XML is valid...) - The JSP code doesn't even call the EntityResolver - something breaks at the basic validation. Also if I comment out the SCHEMA_VALIDATION feature, the setEntityResolver call and the EXTERNAL_NONAMESPACE_SCHEMA_LOCATION property nothing changes. As far as I can tell, the code doesn't even get as far as schema validation. If you've read this far, I thank you, but if you also have any idea what might be causing this behaviour in this JSP page, I'd be really grateful if you could share it with me... Thanks in advance: Andras Babos. ----- End forwarded message ----- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]