更具体的问题: 如何克服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时我也没有放置属性,它就无法加载整个文件。
答案 0 :(得分:2)
回答1
您可以使用Bean Validation(JSR 303)注释来指定验证规则而不是XML架构。
回答2&amp; 3 强>
默认情况下,JAXB(JSR-222)实现不要求元素处于架构顺序或要求元素存在以便将XML解组为对象形式。如果您设置了Schema
,则可以设置ValidationEventHandler
以忽略错误。