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

您可以使用 Bean Validation (JSR 303) 注释来指定验证规则而不是 XML 模式。

回答 2 & 3

默认情况下,JAXB (JSR-222) 实现不要求元素按模式顺序或存在所需的元素以便将 XML 解组为对象形式。如果你有一个Schema集合,你可以设置一个ValidationEventHandler忽略错误。

于 2012-12-27T02:03:46.040 回答