【问题标题】:Handling different XSD versions when binding XML to Java classes将 XML 绑定到 Java 类时处理不同的 XSD 版本
【发布时间】:2014-01-05 06:25:02
【问题描述】:

我希望能够向我的用户公开表示 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 对象绑定?

【问题讨论】:

  • 几个问题:您的 XML Schema 版本有何不同?最新版本可以支持所有以前的版本吗?您是否在 XML 文档的根元素中包含版本属性?你保持命名空间不变吗?
  • @BlaiseDoughan 我真的不知道这些模式会有多么不同,因为定义它们的不是我,而是一个外部系统。但是,我可以通过该系统的版本来区分它们
  • 在我看来,您有两个问题,正在寻求一种解决方案。您必须分解问题并分别解决每个问题。一个问题已经解决了。您可以通过委托验证过程来解决另一个问题。某种“验证器”将确定版本,然后加载适当的处理器类来处理它。我建议研究行为设计模式以寻找可能的解决方案。确实想到了模板和调解器。诸如适配器模式之类的结构设计模式也可能有效。

标签: java xml data-binding jaxb xsd


【解决方案1】:

XML 架构向后兼容

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

XML 架构不向后兼容

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

生成模型

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

解组

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


更新

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

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

【讨论】:

  • 我已经这样做了(虽然解组部分时使用哪个模型背后的逻辑有点不同)。问题是对用户的透明度(返回类型)。直到运行时我才知道将返回哪个模型。你会怎么处理呢?
  • 我在想这样的事情:weblogs.java.net/blog/kohsuke/archive/2007/01/… 但我猜他还有其他想法可以解决;)
  • @esper - 以下是我们在 EclipseLink JAXB (MOXy) 中所做的一些事情,blog.bdoughan.com/2011/09/…blog.bdoughan.com/2013/03/… 可能会对您有所帮助
  • 你通过那里链接我的一些有趣的文章......这一切都必须手动完成还是这里可能会发生一些自动对象生成?
  • @esper - 映射文档和对象图需要手动创建。
猜你喜欢
  • 2014-07-02
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2020-05-19
  • 2021-06-26
相关资源
最近更新 更多