Java : Working with multiple versions of XML Schemas

标签 java xml xsd jaxb version

我有一个应用程序,它接收 XML 消息,然后解析它以执行进一步的处理。为了在我的应用程序中实现此功能,在接收 XML 字符串后,我调用 JAXB 编码器将其编码到 java POJO,然后从这里进行处理。 在我拥有一个 XML 版本之前,这个东西一直运行良好。

问题 但当同一个 XSD 有多个版本时,问题就来了。我的应用程序必须处理两个版本的消息。我的应用程序的客户端可能会发送旧版本的 xml,也可能会发送最新版本的 XML。

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

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

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

* 问题

Is there any simple solution similar like JAXB ?

*

使用的临时解决方案 我使用了一个临时解决方案,但我并不满意它是一个好的解决方案。我所做的是,我使用 XJC 工具为每个 XSD 版本创建了一个单独的 jar。并为每个 jar 创建了不同的包,例如 1. 1.2 版的 Pojos 位于带有基础包 com.cgs.v_12 的 jar 中 2. 2.0 版的 Pojos 与基础包 com.cgs.v_20 位于不同的 jar 中

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

最佳答案

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

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

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

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

关于Java : Working with multiple versions of XML Schemas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40146517/

相关文章:

Java EE - servlet 未转发到 jsp 文件

java - 检查API版本

c# - XSD 的属性以防止 XSD.exe FieldSpecified 标志

java - 将 Java 转换为 XSD 的用例与使用 JAXB 将 XSD 转换为 java 的用例是否不同?

java - 验证 XSD 文件

Java while循环和随机方法

java - 延迟绑定(bind)二级类型参数

java - 如何使用 jython 将参数传递给 java 中的 python 脚本

c# - XML 序列化动态对象

java - 如何使用 xpath 查找特定类型的所有 xml 元素?