Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中处理不断发展的XML模式_Java_Xml_Jaxb - Fatal编程技术网

如何在Java中处理不断发展的XML模式

如何在Java中处理不断发展的XML模式,java,xml,jaxb,Java,Xml,Jaxb,如何在Java中处理不断发展的XML模式?我有一个用例,在这个用例中,我必须在Java应用程序中支持一组旧的、不断发展的XML模式(即支持FooV1、v2、v3、v4、v5) 我的用例包括 -读取针对不同版本的FooXML模式编写的所有FooXML内容 -使用不同版本的OVAL XML模式合并可能以不同格式编写的Foo XML内容(即合并Foo v1和Foo v5) Foo-XML模式相当复杂,并且存在已知的向后兼容性问题,因此Foo v1 XML内容可能无法通过使用Foo v3 XML模式的X

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

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

Foo-XML模式相当复杂,并且存在已知的向后兼容性问题,因此Foo v1 XML内容可能无法通过使用Foo v3 XML模式的XML模式验证

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

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


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

根据我的经验,最重要的是数据模型,而不是输入格式。如果您能够提供一个干净的模型并抽象出不同输入的所有缺点,那么最终将得到一个更干净、更易于管理的代码行


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

每个新版本都有Java转换器。它们能够从各自的先前版本转换。我们将v1作为XML,使用JAXB将其转换为Java,然后转换为数据模型v2、v3、v4、v5。转换器都处于版本控制之下,这是每个发布工件的一部分


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

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

我不知道
XSLT
在这里是否有效?如果不是的话,我可能会结合您的方法,使用多组绑定,然后使用一个额外的公共集,由您自己编写。每次想使用xml data.BTW Java时,都要查看公共集合。Java是一个单词,而不是首字母缩略词。谢谢您的反馈。特别是建议创建顶级模型,然后使用JAXB为每个模式版本生成绑定,然后创建转换器将JAXB模型数据转换为顶级数据模型的部分。我会考虑这一点。再次感谢。我愿意接受建议,但我的要求之一是我需要能够修改XML的内容,因此我需要将整个XML内容加载到某种模型中,以便在XML中插入元素或属性。我只能考虑创建自己的数据模型,然后手动解析XML或使用数据绑定方法。我认为应该使用XSLT或XQuery—可能是XQuery更新。