2

是否可以在通过两个 xsd 解组时验证 xml?我知道您通过执行以下操作将 xml 解组为具有多个上下文的对象:

context = JAXBContext.newInstance("onepackagecontext:secondpackagecontext");

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

unmarshaller.setSchema(getSchema(url));

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

4

2 回答 2

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 );
于 2013-03-12T18:30:43.467 回答
2

我看不出这应该起作用的原因。如果两个模式之间没有关系,这可能会出现问题
如果您看一下从 XSD 生成 Java 类的示例 - 如果您向生成器提供两个不相关的 XSD,则可能会导致尝试创建多重继承和问题像那样。我怀疑您在这里可能有一些糟糕的设计
我建议您重新访问这些模式,看看如何将它们统一到一个能够满足您需求的模式中。

于 2012-06-27T13:41:57.790 回答