【问题标题】:Java : Working with multiple versions of XML SchemasJava:使用多个版本的 XML 模式
【发布时间】: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),并以这种内部格式进行进一步处理。

标签: java xml xsd jaxb version


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2011-07-17
    • 2014-08-13
    • 2015-02-11
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多