【问题标题】:How to handle evolving XML schema in Java如何在 Java 中处理不断发展的 XML 模式
【发布时间】:2013-01-10 22:43:00
【问题描述】:

如何在 Java 中处理不断变化的 XML 模式?我有一个用例,我必须在 Java 应用程序中支持一组旧的和不断发展的 XML 模式(即支持 Foo v1、v2、v3、v4、v5)。

我的用例包括 - 读取针对不同版本的 Foo XML 模式编写的所有 Foo XML 内容 - 合并可以用不同版本的 OVAL XML 模式编写的 Foo XML 内容(即将 Foo v1 与 Foo v5 合并)。

Foo XML 架构相当复杂,并且存在已知的向后兼容性问题,因此 Foo v1 XML 内容可能无法使用 Foo v3 XML 架构进行 XML 架构验证。

我想到了两种方法 1) 使用 JAXB 等 Java XML 数据绑定,并为每个版本的 XML 模式生成一组绑定。以 Foo XML 模式为例,我将为 Foo XML 模式 v1 到 v5 生成 5 组绑定。挑战在于如何将 Foo XML 内容的版本与另一个版本的 XML 内容合并。

2) 创建一组 Java 数据模型并使用 SAX、DOM、JDOM 手动解析它,并尝试解决我可能遇到的所有向后兼容性问题。现在的挑战是我必须在没有 JAXB 帮助的情况下自己解析 XML。

我想就处理不断变化的 XML 模式的最佳方法获得一些建议。 Java XML 数据绑定是正确的前进路径,还是创建我自己的 Java 数据模型并手动解析?

【问题讨论】:

  • 我不知道XSLT 是否可以在这里工作?如果没有,我可能会结合使用您的方法,使用几组绑定,然后使用您自己编写的一组额外的常用集合。每次要使用 xml 数据时都要检查公用集。
  • BTW Java 是一个单词而不是首字母缩略词

标签: java xml jaxb


【解决方案1】:

根据我的经验,最重要的是数据模型,而不是输入格式。如果您可以提供一个干净的模型并抽象出不同输入的所有讨厌的东西,那么您最终会得到一个更干净、更易于管理的代码线。

鉴于单个文档的版本往往是增量的,如果您自己编写解析器,您可能可以获得相当多的代码重用,或者您可以创建并行 JAXB 包来处理与另一个类配对的每种格式以进行转换该版本特定模型到您的顶级模型。

【讨论】:

  • 感谢您的反馈。特别是您建议创建顶级模型的部分,然后使用 JAXB 为每个版本的模式生成绑定,然后创建一个转换器将 JAXB 模型数据转换为顶级数据模型。我会考虑到这一点。再次感谢。
【解决方案2】:

我们为每个新版本提供 Java 转换器。他们能够从各自的先前版本进行转换。我们将 v1 作为 XML,使用 JAXB 将其转换为 Java,然后转换为数据模型 v2、v3、v4、v5。转换器都受版本控制,是每个已发布工件的一部分。

此外,我们还支持 v2-1、v2-2 等分支。这要求我们有从分支 n 到下一个主要 n+1 的转换器(例如 v2-2 -> v3)。每隔一段时间,我们就会停止支持“非常旧”的分支。

【讨论】:

    【解决方案3】:

    模式演变是数据绑定方法的一大缺点。正如您所发现的,如果您的模式不稳定,那么数据绑定将会很麻烦。这里有一个基本的冲突:XML 被设计为在它处理的数据结构中是灵活的(“半结构化”),而 Java 不是。您确定数据绑定是适合您的方法吗?使用专为 XML 设计的编程语言(例如 XSLT 或 XQuery)会不会更好?

    【讨论】:

    • 我愿意接受建议,但我的要求之一是我需要能够修改 XML 的内容,因此我需要将整个 XML 内容加载到某种模型中,以便我可以在 XML 中插入元素或属性。我只能想到自己创建数据模型,然后手动解析 XML 或者使用数据绑定的方式。
    • 我认为您应该使用 XSLT 或 XQuery - 可能使用 XQuery 更新。
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多