JAXB.通过两个xsd验证XML

bor*_*dev 2 java jaxb java-ee

是否可以在两个xsd解组的同时验证xml?我知道你通过这样做将xml解组为具有多个上下文的对象:

context = JAXBContext.newInstance("onepackagecontext:secondpackagecontext");
Run Code Online (Sandbox Code Playgroud)

我可以使用一个模式进行验证:

unmarshaller.setSchema(getSchema(url));
Run Code Online (Sandbox Code Playgroud)

我该怎么办才能使用两个XSD进行验证?

小智 5

你可以这样做:

final InputStream isMain = this.getClass().getResourceAsStream( "/real.xsd" );

final InputStream isImport=
    this.getClass().getResourceAsStream( "/import.xsd" );

final InputStream isInclude =
    this.getClass().getResourceAsStream( "/include.xsd" );

final Source include = new StreamSource( isInclude );
final Source imp = new StreamSource( isImport );
final Source main = new StreamSource( isMain  );

final Source[] schemaFiles = new Source[] {
    include, imp, main
};

final SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
final Schema schema = sf.newSchema( schemaFiles );

final JAXBContext jc =
    JAXBContext.newInstance( YourJaxb.class );

final Unmarshaller unmarshaller = jc.createUnmarshaller();

final JAXBElement<YourJaxb> jaxbElement =
    unmarshaller.unmarshal( 
        YourJaxb.class );

final JAXBSource source = new JAXBSource( jc, jaxbElement.getValue() );
final ValidationErrorHandler val = new ValidationErrorHandler();
final Validator validator = schema.newValidator();
validator.setErrorHandler( val );
validator.validate( source );
Run Code Online (Sandbox Code Playgroud)