如何在Java中处理不断发展的XML架构?我有一个用例,我必须在Java应用程序中支持一组旧的和不断发展的XML模式(即支持Foo v1,v2,v3,v4,v5)。
我的用例包括 - 阅读针对不同版本的Foo XML模式编写的所有Foo XML内容 - 合并可以使用不同版本的OVAL XML模式(即将Foo v1与Foo v5合并)的不同写入的Foo XML内容。
Foo XML架构相当复杂,并且存在已知的向后兼容性问题,因此Foo v1 XML内容可能无法使用Foo v3 XML架构验证XML架构验证。
我想到了两种方法 1)使用Java XML数据绑定(如JAXB),并为每个版本的XML模式生成一组绑定。以Foo XML模式为例,我将为Foo XML模式v1到v5生成5组绑定。挑战在于如何将Foo XML内容的版本与另一版本的XML内容合并。
2)创建一组Java数据模型并使用SAX,DOM,JDOM手动解析它,并尝试解决我可能遇到的所有向后兼容性问题。现在的挑战是我必须在没有JAXB帮助的情况下自己解析XML。
我想就处理不断发展的XML架构的最佳方法提出一些建议。 Java XML数据绑定是正确的路径还是创建我自己的Java数据模型并手动解析它?
答案 0 :(得分:3)
根据我的经验,最重要的是数据模型而不是输入格式。如果你能提供一个干净的模型并抽象出不同输入的所有肮脏,你最终会得到一个更干净,更易于管理的代码。
鉴于单个文档的版本往往是增量的,如果您自己编写解析器,则可能会获得相当数量的代码重用,或者您可以创建并行JAXB包来处理与另一个类配对的每个格式以进行转换您的顶级模型的特定版本模型。
答案 1 :(得分:1)
我们为每个新版本都安装了Java转换器。他们可以从相应的先前版本转换。我们将v1作为XML获得,使用JAXB将其转换为Java,然后转换为数据模型v2,v3,v4,v5。转换器都受版本控制,是每个已发布工件的一部分。
另外,我们支持v2-1,v2-2等分支机构。这要求我们具有从分支n到下一个主要n + 1的转换器(例如,v2-2 - > v3)。在一定的时间间隔,我们停止支持#34;非常老的"分支。
答案 2 :(得分:1)
架构演变是数据绑定方法的一大缺陷。如果您的架构不稳定,那么数据绑定将是一个麻烦,正如您所发现的那样。这里存在一个基本的冲突:XML被设计为在它处理的数据结构中是灵活的(“半结构化”),而Java则不是。您确定数据绑定对您来说是正确的方法吗?使用为XML设计的编程语言(例如XSLT或XQuery)可能不是更好吗?