【发布时间】:2011-07-19 21:09:47
【问题描述】:
我有两个版本的 XSD 架构。 XSD 非常相似,尽管 XML 命名空间不同(xml 命名空间用于版本控制)。我想使用相同的对象模型解组这两个版本。 JAXB 用于生成对象模型。
有没有一种简单的方法可以将两个略有不同的 XML 模型读入同一个对象模型中?
【问题讨论】:
标签: xml xsd jaxb versioning
我有两个版本的 XSD 架构。 XSD 非常相似,尽管 XML 命名空间不同(xml 命名空间用于版本控制)。我想使用相同的对象模型解组这两个版本。 JAXB 用于生成对象模型。
有没有一种简单的方法可以将两个略有不同的 XML 模型读入同一个对象模型中?
【问题讨论】:
标签: xml xsd jaxb versioning
标准 JAXB 无法做到这一点,尽管某些实现可能有专有的变通方法。
您可以尝试将文档读入 DOM 模型(即 org.w3c.dom.Document),以编程方式设置 DOM 的名称空间 URI 以匹配 JAXB 类模型中的名称,然后解组 DOM进入 JAXB(使用 Unmarshaller.unmarshall(document)。这会很糟糕,但这对你来说可能无关紧要。
作为助手,请查看 this PDF 描述版本控制架构的最佳实践(提示:更改命名空间 URI 不是最佳实践...)
【讨论】:
您可以将 JAXB 实现(Metro、MOXy、JaxMe 等)与 StAX 解析器(RI、Woodstox 等)结合使用来解决此问题。假设除了您的文档向后兼容的名称之外,您还可以将您的对象模型映射到最新的模式。然后,您将欺骗您的 JAXB 实现,使其认为文档的所有版本都在使用该名称空间。诀窍是使用来自 StAX API 的StreamReaderDelegate。
举个类似的例子
【讨论】: