2

2つのxsdでマーシャリングを解除しながらxmlを検証することは可能ですか?これを行うことで、xmlをアンマーシャリングしていくつかのコンテキストを持つオブジェクトを作成することを知っています。

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

検証に1つのスキーマを使用できます。

unmarshaller.setSchema(getSchema(url));

検証に2つの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

これが機能する理由がわかりません。2つのスキーマの間に関係がない場合、これは問題になる可能性があり
ます。たとえば、XSDからのJavaクラスの生成を見ると、関連のない2つのXSDをジェネレーターに提供すると、複数の継承と問題が発生する可能性があります。そのように。ここでいくつかの悪い設計があるのではないか
と思います。私が提案するのは、スキーマを再検討し、ニーズに答える1つのスキーマにそれらを統合する方法を確認することです。

于 2012-06-27T13:41:57.790 に答える