Validierung von XSD anhand der W3C-XML-Schemadefinition

Ich erstelle einige XML-Schemata und möchte sicherstellen, dass unser Generator gültige XML-Schemadokumente erstellt (nicht XML). Ich habe versucht, den Code für die Validierung des XML-Schemadokuments zu finden, bin aber kläglich gescheitert. Ich hätte nicht gedacht, dass es so komplex wird.

  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 );
    }
  }

Dieser Code ist ziemlich nah an dem, was ich tun muss, aber ich erhalte die folgenden Fehler.

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)

Beim Aufrufen von setSchema (uri) verwende ich eine URL, um sicherzustellen, dass XMLSchema.dtd und datatypes.dtd relativ sind, und ich hoffe, dass sie verfügbar sind. Ich bin mir jedoch nicht sicher, wie ich dies überprüfen kann.

Ich vermute, dass es nicht gefällt, dass XMLSchema.xsd, XMLSchema.dtd und datatypes.dtd in meinem Jar gebündelt sind und daher vom Classloader geladen werden. Gibt es sowieso eine Lösung, damit ich mich auf meine nächste Hürde begeben kann?org.xml.sax.SAXParseException: src-resolve: Der Name 'xml: lang' kann nicht in eine (n) 'Attributdeklarations'-Komponente aufgelöst werden. vorausgesetzt, es verhält sich genauso, als hätte ich das XMLSchema von einem Verzeichnispfad außerhalb einer JAR geladen.

Meine Ziele sind:

Laden Sie die Datei XMLSchema.xsd aus der JAR-Datei, damit sie ordnungsgemäß mit dem Code verpackt ist.Überwinde den nächsten Fehler in Bezug auf xml: lang.

Hoffentlich frage ich nicht zu viel!

Danke, Stuart

Antworten auf die Frage(2)

Ihre Antwort auf die Frage