【发布时间】:2017-03-01 23:40:45
【问题描述】:
我有一个应用程序接收 XML 消息,然后对其进行解析以执行进一步处理。为了在我的应用程序中工作,在接收到 XML 字符串后,我调用 JAXB 编组器将其编组到 java POJO 和处理从这里开始。 在我拥有一个 XML 版本之前,这件事一直很好用。
问题 但是当同一个 XSD 有多个版本时,问题就来了。我的应用程序必须处理这两个版本的消息。我的应用程序的客户端可能会发送旧版本的 xml,也可能会发送最新版本的 XML。
对于 JAXB,我必须使用 JAVA XJC 工具将 XSD 转换为 java pojos,当我转换最新版本的 XSD 时出现问题,它具有与以前版本相同的类名,但类的内部字段和层次结构是不同的。即使我将 XJC 输出放在每个版本的不同 jar 中,这也会导致问题。
预期的解决方案 这种版本更改预计每 6 个月发生一次,我必须让我的系统能够同时读取新版本的 XML 以及旧版本。 我想知道如何使用 JAXB 或其他框架在 JAVA 中管理这种 XML 处理。
我应该使用 SAX 解析器吗?我读过它与 JAXB 相比效率不高。在过去几天研究 SAX 解析器之后,我发现它很容易出错,因为它涉及查找每个元素并从中获取值并将其放入我们自己的 java 结构中,这需要付出很多努力与 JAXB 相比。
* 问题
有没有类似 JAXB 的简单解决方案?
*
使用的临时解决方案 我使用了一个临时解决方案,但我并不满意它是一个好的解决方案。我所做的是,我使用 XJC 工具为每个 XSD 版本创建了一个单独的 jar。并为每个罐子创建不同的包,例如 1. 1.2 版的 Pojos 在一个带有基本包 com.cgs.v_12 的 jar 中 2. 2.0 版的 Pojos 在不同的 jar 中,基础包为 com.cgs.v_20
我已将 maven 依赖项添加到我的系统中,并使用它们来处理不同的版本。
【问题讨论】:
-
怎么知道输入xml的版本?您需要解析文件以获取版本还是从两个不同的通道接收输入文件?
-
您可以尝试将任何版本格式的xml转换为不会更改的内部格式(例如通过xslt),并以这种内部格式进行进一步处理。