より具体的な質問: JAXB の次の制限を克服するにはどうすればよいですか (可能な場合):
1) xml ファイルの検証では、HD のどこかにスキーマ ファイルを作成する必要があります。xml を検証するために新しいファイルを作成する必要はありません。いくつかのストリームを使用したスタック オーバーフローに関する投稿を見つけましたが、他の方法があるかどうか疑問に思っていました。
2) ファイル内で xml 要素を順不同で指定し、ロードする方法を教えてください。たとえば、次の両方を正しくロードしたいと思います。
<xml>
<defaults .../>
<people>
...
</people>
</xml>
<xml>
<people>
...
</people>
<defaults .../>
</xml>
アンマーシャリングに使用されるコード:
JAXBContext context = JAXBContext.newInstance(MyConfig.class);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
context.generateSchema(new MySchemaOutputResolver(schemaF));
Unmarshaller unmarshaller = context.createUnmarshaller();
Schema schema = sf.newSchema(schemaF);
unmarshaller.setSchema(schema);
MyConfig loaded = (MyConfig)unmarshaller.unmarshal(settingsU);
private static class MySchemaOutputResolver extends SchemaOutputResolver {
public MySchemaOutputResolver(File schemaFile) {
this.schemaFile = schemaFile;
}
@Override
public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
return new StreamResult(schemaFile);
}
private File schemaFile;
}
プロパティについても同様です。つまり、順不同でプロパティを指定しても機能するはずです。プロパティをテストしていませんが、上記は間違いなくロードに失敗します。JAXB は要素の順序を強制します。上記の例では、これはオプションである必要があります。
3) プロパティと要素をオプションにすることができます。指定しない場合でも、ファイルはロードされ、欠落しているプロパティは設定されません (つまり、クラスで初期化されたデフォルト値を使用します)。現在、これも機能しません。required=false の場合でもプロパティを配置しないと、ファイル全体の読み込みに失敗するだけです。