java - 将 XML 绑定(bind)到 Java 类时处理不同的 XSD 版本

标签 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 对象绑定(bind)库之一?

最佳答案

XML 模式向后兼容

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

XML 模式不向后兼容

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

生成模型

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

解码

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


更新

I've already done that (the logic behind which model to use when unmarshaling part is a bit different though). the problem is transparency towards the user (return type). It's not until runtime that I know which model will be returned. How would you handle that?

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

关于java - 将 XML 绑定(bind)到 Java 类时处理不同的 XSD 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635038/

相关文章:

安卓数据绑定(bind) : Wrong BR class generated for obfuscated AAR

c# - InitializeComponent 在绑定(bind)时触发 StackOverflow 异常

java - 为什么我的 JSON 映射器无法识别我的对象?

java - 在 Maven 中获取版本(次要和主要)

java - 无法在 JscrollPane 中查看 LastItem

.net - 使用带有导入的 XSD 进行 XML 验证,并包含在 .net 核心中

java - 检查是否恰好存在节点的一个属性并在 XPAth 中返回该属性的值

android - 调用 TextInputLayout 的 setError() 时,不要将提示移动到顶部

更改属性时,C# XAML 数据绑定(bind)无效

java - 通过 appengine 上传文件到谷歌云存储