将XML绑定到Java类时处理不同的XSD版本

时间:2013-12-17 13:08:09

标签: java xml data-binding jaxb xsd

我希望能够向用户公开表示XML文件的对象。这可以通过许多库(xmlBeans,JAXB ...)来完成,并且在我必须支持该XML文件的不同版本(不断发展的模式问题)以实现向后兼容之前,这一切都很好。

我希望这对我的用户完全透明,这意味着我的系统需要决定在特定时间点需要使用哪个版本的XML文件。

这是我想要实现的简短伪代码:

public VersionIndependantObject getVersionSpecificXmlBindedObject() {
    //Determening XSD version and binding XML file to JAVA object
    return javaObject;
}

VersionIndependantObject - 这是当时在系统上找到的XML文件的对象表示(可能是v1,v2 ......)。

是否可以使用现有的XML库之一 - > Java Object binding?

1 个答案:

答案 0 :(得分:2)

XML Schema向后兼容

XML模式通常会发展,以便它们向后兼容。这是通过仅添加可选的新属性和元素来完成的。这意味着旧的XML文档仍然对新模式有效。使用此策略时,您只需要根据新的XML模式重新生成模型。

XML架构不向后兼容

如果模型不能向后兼容,那么事情会更复杂。

生成模型

您可以为每个版本的XML架构生成一个模型。如果命名空间未更改,则需要覆盖默认包名称。

<强>解组

不是直接解组XML,而是使用StAX解析器解析它。然后,您可以使用XMLStreamReader获取版本属性并确定要使用的模型。然后将XMLStreamReader解组到该模型中。


更新

  

我已经完成了(当时使用哪种模型的逻辑)   unmarshaling部分有点不同但是)。问题是   对用户的透明度(返回类型)。直到运行时才会这样   我知道将返回哪个型号。你会怎么处理?

您需要具有可以是任何生成的模型的泛型返回类型(即Object),或者像您的问题中那样具有特定于版本的方法,每个方法都返回其相应的生成模型。我将研究正在使用的模式演化策略。许多人试图向后友好(因为它也有助于他们的处理)。