I spent the day (actually yesterday) trying to get Schema validation working a bit better. A diff to org/apache/xerces/validators/schema/XSchemaValidator.java and a description is appended below for anyone who wants to use it.
George ******************************************* reportSchemaError() was printing a stack trace for each validation error. It was also eating the exceptions thrown instead of propagating them back up the call stack. I commented out the try/catch block so the calling application gets the exception and can decide if a stack trace is appropriate. I left printStackTrace alone where it was being called in "can't get here" situations. A few System.exit() calls were commented out. They should never be called but I'm not fond of having them around in APIs. traverseAttributeDecl() was looking for the old 'required="true"' on an attribute definition instead of 'minOccurs="1"' to decide if an attribute was required or not. The datatypes 'negative-integer', 'positive-integer', 'non-negative-integer', and 'non-positive-integer' weren't being correctly added to the datatype registry and were therefore unavailable. *** xschemavalidatororig.java Wed Jan 05 15:12:30 2000 --- xschemavalidator.java Fri Jan 07 01:20:12 2000 *************** *** 1683,1694 **** catch (SAXException se) { se.getException().printStackTrace(); System.err.println("error parsing schema file"); ! System.exit(1); } catch (Exception e) { e.printStackTrace(); System.err.println("error parsing schema file"); ! System.exit(1); } fSchemaDocument = fSchemaParser.getDocument(); if (fSchemaDocument == null) { --- 1683,1694 ---- catch (SAXException se) { se.getException().printStackTrace(); System.err.println("error parsing schema file"); ! // System.exit(1); } catch (Exception e) { e.printStackTrace(); System.err.println("error parsing schema file"); ! // System.exit(1); } fSchemaDocument = fSchemaParser.getDocument(); if (fSchemaDocument == null) { *************** *** 1703,1709 **** } catch (Exception e) { e.printStackTrace(System.err); ! System.exit(1); } } --- 1703,1709 ---- } catch (Exception e) { e.printStackTrace(System.err); ! // System.exit(1); } } *************** *** 2206,2212 **** return index; } ! public int traverseDatatypeDecl(Element datatypeDecl) { int newTypeName = fStringPool.addSymbol(datatypeDecl.getAttribute(ATT_NAME)); int export = fStringPool.addSymbol(datatypeDecl.getAttribute(ATT_EXPORT)); --- 2206,2212 ---- return index; } ! public int traverseDatatypeDecl(Element datatypeDecl) throws Exception { int newTypeName = fStringPool.addSymbol(datatypeDecl.getAttribute(ATT_NAME)); int export = fStringPool.addSymbol(datatypeDecl.getAttribute(ATT_EXPORT)); *************** *** 2449,2455 **** // attribute default type int attDefaultType = -1; int attDefaultValue = -1; ! boolean required = attrDecl.getAttribute("required").equals("true"); if (required) { attDefaultType = fStringPool.addSymbol("#REQUIRED"); } else { --- 2449,2455 ---- // attribute default type int attDefaultType = -1; int attDefaultValue = -1; ! boolean required = attrDecl.getAttribute("minOccurs").equals("1"); if (required) { attDefaultType = fStringPool.addSymbol("#REQUIRED"); } else { *************** *** 3011,3027 **** return -1; } ! private void reportSchemaError(int major, Object args[]) { ! try { fErrorReporter.reportError(fErrorReporter.getLocator(), SchemaMessageProvider.SCHEMA_DOMAIN, major, SchemaMessageProvider.MSG_NONE, args, XMLErrorReporter.ERRORTYPE_RECOVERABLE_ERROR); ! } catch (Exception e) { ! e.printStackTrace(); ! } } // --- 3011,3027 ---- return -1; } ! private void reportSchemaError(int major, Object args[]) throws Exception { ! // try { fErrorReporter.reportError(fErrorReporter.getLocator(), SchemaMessageProvider.SCHEMA_DOMAIN, major, SchemaMessageProvider.MSG_NONE, args, XMLErrorReporter.ERRORTYPE_RECOVERABLE_ERROR); ! // } catch (Exception e) { ! // e.printStackTrace(); ! // } } // *************** *** 3113,3119 **** String integerSubtypeTable[][] = { { "non-negative-integer", DatatypeValidator.MININCLUSIVE , "0"}, ! { "postive-integer", DatatypeValidator.MININCLUSIVE, "1"}, { "non-positive-integer", DatatypeValidator.MAXINCLUSIVE, "0"}, { "negative-integer", DatatypeValidator.MAXINCLUSIVE, "-1"} }; --- 3113,3119 ---- String integerSubtypeTable[][] = { { "non-negative-integer", DatatypeValidator.MININCLUSIVE , "0"}, ! { "positive-integer", DatatypeValidator.MININCLUSIVE, "1"}, { "non-positive-integer", DatatypeValidator.MAXINCLUSIVE, "0"}, { "negative-integer", DatatypeValidator.MAXINCLUSIVE, "-1"} }; *************** *** 3149,3155 **** } catch (UnknownFacetException ufe) { System.out.println("Internal error initializing registry - Unknown facet: "+integerSubtypeTable[i][0]); } ! fRegistry.put(integerSubtypeTable[0], v); } } --- 3149,3155 ---- } catch (UnknownFacetException ufe) { System.out.println("Internal error initializing registry - Unknown facet: "+integerSubtypeTable[i][0]); } ! fRegistry.put(integerSubtypeTable[i][0], v); } }