Java:使用多个版本的XML Schema

时间:2016-10-20 05:57:31

标签: java xml xsd jaxb version

我有一个接收XML消息然后解析它以执行进一步处理的应用程序。为了让我的应用程序在我的应用程序中工作,在收到XML字符串后,我调用JAXB marshaller将其封送到java POJO和处理从此处开始。 这个东西很好用,直到我有一个版本的XML。

问题 但是,当同一个XSD有多个版本时,就会出现问题。我的应用程序必须处理这两种版本的消息。我的应用程序的客户端可能会发送旧版本的xml,或者他们可能会发送最新版本的XML。

对于JAXB,我必须使用JAVA XJC工具将XSD转换为java pojos,当我转换最新版本的XSD时出现问题,它与前一版本具有相同的类名,但内部字段和类的层次结构是不同的。即使我将XJC输出放在每个版本的不同罐子中,这也会引起问题。

预期解决方案 版本的这种变化预计每6个月发生一次,我必须让我的系统能够与旧版本一起阅读更新版本的XML。 我想知道如何使用JAXB或其他框架在JAVA中管理这个XML处理。

我应该使用SAX Parser吗?我已经读过它与JAXB相比效率不高。在最近几天使用SAX解析器之后,我发现它可能容易出错,因为它涉及查找每个元素并从中获取值并将其放入我们自己的java结构中,这需要很多努力与JAXB相比。

* 问题

  

是否有类似JAXB的简单解决方案?

*

使用临时解决方案 我使用了一个临时解决方案,我不满意这是一个很好的解决方案。我做的是,我使用XJC工具为每个XSD版本创建了一个单独的jar。并在每个罐子上创建不同的包装,例 1.版本1.2的Pojos在一个带有基本软件包com.cgs.v_12的jar中 2.版本2.0的Pojos与基础包com.cgs.v_20

在不同的jar中

我已将两者作为maven依赖添加到我的系统并使用它们来处理不同的版本。

1 个答案:

答案 0 :(得分:0)

对于JAXB /在XSD之间映射的任何其他解决方案 - > POJO,这将是1-1映射,尤其是在生成POJO的情况下。

你必须这样做吗? (1)将整个XML映射到POJO,或 (2)该XML的子集是否为静态/固定POJO模型?

如果(1),由于后续版本的变化无法预料,我相信上面的解决方案将使用策略模式根据版本选择正确的JAXB工件

如果(2),您可以使用XPATH进行探索,定义每个版本的XPATH映射。