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

esp*_*per 5 java xml data-binding xsd jaxb

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

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

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

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

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

有没有办法处理一个已经存在的XML库 - > Java Object绑定?

bdo*_*han 3

XML 架构向后兼容

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

XML 架构不向后兼容

如果模型不向后兼容,那么事情就会变得更加复杂。

生成模型

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

解组

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


更新

我已经这样做了(尽管解组部分时使用哪个模型背后的逻辑有点不同)。问题是对用户的透明度(返回类型)。直到运行时我才知道将返回哪个模型。你会怎么处理?

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