0

より具体的な質問: 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 の場合でもプロパティを配置しないと、ファイル全体の読み込みに失敗するだけです。

4

1 に答える 1

3

1の答え

XML スキーマの代わりに、Bean Validation (JSR 303) アノテーションを使用して検証ルールを指定できます。

2と3の答え

デフォルトでは、JAXB (JSR-222) 実装では、XML をオブジェクト形式に非整列化するために、要素がスキーマの順序になっていることや、必要な要素が存在する必要はありません。セットがある場合は、エラーを無視するようにSchema設定できます。ValidationEventHandler

于 2012-12-27T02:03:46.040 に答える