Sprawdzanie poprawności XSD względem definicji schematu XML W3C

Generuję niektóre schematy XML i chciałbym upewnić się, że nasz generator tworzy poprawne dokumenty schematu XML (nie XML). Próbowałem wymyślić kod do sprawdzenia poprawności dokumentu XML Schema, ale zawiodłem. Nie sądziłem, że to będzie ten kompleks.

  private void validateXsd( String xsdAsString ) {
    try {
      SAXParserFactory factory = SAXParserFactory.newInstance();
      factory.setValidating(true);
      factory.setNamespaceAware(true);
      factory.setFeature( "http://apache.org/xml/features/validation/schema", true );

      SchemaFactory schemaFactory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );

      URL xmlSchemaXSD = this.getClass().getClassLoader().getResource( "com/metamodel/xsd/XMLSchema.xsd" );
      URL xmlSchemaDTD = this.getClass().getClassLoader().getResource( "com/metamodel/xsd/XMLSchema.dtd" );
      URL xmlSchemaDataTypes = this.getClass().getClassLoader().getResource( "com/metamodel/xsd/datatypes.dtd" );

      // requires that XMLSchema.dtd and datatypes.dtd are present in the same directory with the XMLSchema.xsd.
      factory.setSchema( schemaFactory.newSchema( xmlSchemaXSD ) );

      SAXParser parser = factory.newSAXParser();
      // parser.setProperty( "http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema" );

      XMLReader reader = parser.getXMLReader();
      reader.setErrorHandler( new SimpleErrorHandler() );
      reader.parse( new InputSource( IOUtils.toInputStream( xsdAsString ) ) );
    } catch( SAXParseException e ) {
      e.printStackTrace( System.err );
    } catch ( ParserConfigurationException e ) {
      e.printStackTrace( System.err );
    } catch ( SAXException e ) {
      e.printStackTrace( System.err );
    } catch ( IOException e ) {
      e.printStackTrace( System.err );
    }
  }

Ten kod jest dość zbliżony do tego, co muszę zrobić, ale otrzymuję następujące błędy.

org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document 'jar:file:/r:/as4ot/lib/metamodel.jar!/com/metamodel/xsd/XMLSchema.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:172)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:382)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaError(XSDHandler.java:2245)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchema(XSDHandler.java:1590)
    at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:438)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:556)
    at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:523)
    at com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl.newSchema(SchemaFactoryImpl.java:206)
    at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:489)
    at javax.xml.validation.SchemaFactory.newSchema(SchemaFactory.java:521)

Używam adresu URL podczas wywoływania setSchema (uri), aby upewnić się, że XMLSchema.dtd i datatypes.dtd są względne i mam nadzieję, że są dostępne, ale nie jestem pewien, jak mogę to sprawdzić.

Zgaduję, że nie podoba mi się fakt, że XMLSchema.xsd, XMLSchema.dtd i datatypes.dtd są spakowane w moim słoiku, a zatem ładowane przez program ładujący klasy. Czy i tak należy to rozwiązać, abym mógł przejść do następnej przeszkodyorg.xml.sax.SAXParseException: src-resolve: Nie można rozwiązać nazwy „xml: lang” na składnik (n) „deklaracja atrybutu”. zakładając, że zachowuje się tak samo jak podczas ładowania XMLSchema ze ścieżki katalogu poza słoikiem.

Moje cele to:

Załaduj plik XMLSchema.xsd z wnętrza słoika, aby został starannie zapakowany wraz z kodem.Przejdź obok następnego błędu dotyczącego pliku xml: lang.

Mam nadzieję, że nie proszę o wiele!

Dzięki, Stuart

questionAnswers(2)

yourAnswerToTheQuestion