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