我怎么能在JAXB中做某些事情,比如忽略xml元素的顺序?

时间:2012-12-27 01:26:07

标签: java xml binding jaxb annotations

更具体的问题: 如何克服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时我也没有放置属性,它就无法加载整个文件。

1 个答案:

答案 0 :(得分:2)

回答1

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

回答2&amp; 3

默认情况下,JAXB(JSR-222)实现不要求元素处于架构顺序或要求元素存在以便将XML解组为对象形式。如果您设置了Schema,则可以设置ValidationEventHandler以忽略错误。