我希望能够向用户公开表示XML文件的对象。这可以通过许多库(xmlBeans,JAXB ...)来完成,并且在我必须支持该XML文件的不同版本(不断发展的模式问题)以实现向后兼容之前,这一切都很好。
我希望这对我的用户完全透明,这意味着我的系统需要决定在特定时间点需要使用哪个版本的XML文件。
这是我想要实现的简短伪代码:
public VersionIndependantObject getVersionSpecificXmlBindedObject() {
//Determening XSD version and binding XML file to JAVA object
return javaObject;
}
VersionIndependantObject - 这是当时在系统上找到的XML文件的对象表示(可能是v1,v2 ......)。
是否可以使用现有的XML库之一 - > Java Object binding?
答案 0 :(得分:2)
XML模式通常会发展,以便它们向后兼容。这是通过仅添加可选的新属性和元素来完成的。这意味着旧的XML文档仍然对新模式有效。使用此策略时,您只需要根据新的XML模式重新生成模型。
如果模型不能向后兼容,那么事情会更复杂。
生成模型
您可以为每个版本的XML架构生成一个模型。如果命名空间未更改,则需要覆盖默认包名称。
<强>解组强>
不是直接解组XML,而是使用StAX解析器解析它。然后,您可以使用XMLStreamReader
获取版本属性并确定要使用的模型。然后将XMLStreamReader
解组到该模型中。
我已经完成了(当时使用哪种模型的逻辑) unmarshaling部分有点不同但是)。问题是 对用户的透明度(返回类型)。直到运行时才会这样 我知道将返回哪个型号。你会怎么处理?
您需要具有可以是任何生成的模型的泛型返回类型(即Object
),或者像您的问题中那样具有特定于版本的方法,每个方法都返回其相应的生成模型。我将研究正在使用的模式演化策略。许多人试图向后友好(因为它也有助于他们的处理)。