【问题标题】:JAXB: two versions of XSD, one object modelJAXB:两个版本的 XSD,一个对象模型
【发布时间】:2011-07-19 21:09:47
【问题描述】:

我有两个版本的 XSD 架构。 XSD 非常相似,尽管 XML 命名空间不同(xml 命名空间用于版本控制)。我想使用相同的对象模型解组这两个版本。 JAXB 用于生成对象模型。

有没有一种简单的方法可以将两个略有不同的 XML 模型读入同一个对象模型中?

【问题讨论】:

    标签: xml xsd jaxb versioning


    【解决方案1】:

    标准 JAXB 无法做到这一点,尽管某些实现可能有专有的变通方法。

    您可以尝试将文档读入 DOM 模型(即 org.w3c.dom.Document),以编程方式设置 DOM 的名称空间 URI 以匹配 JAXB 类模型中的名称,然后解组 DOM进入 JAXB(使用 Unmarshaller.unmarshall(document)。这会很糟糕,但这对你来说可能无关紧要。

    作为助手,请查看 this PDF 描述版本控制架构的最佳实践(提示:更改命名空间 URI 不是最佳实践...)

    【讨论】:

    • 不错的链接。更快的过滤方法可以基于 Stax 或 Sax,而不是 DOM。
    • @Ed:是的,没错。更努力地串起来,但可能是更好的解决方案。
    • 这可能是 SAX 最简单的一种情况,因为很容易添加过滤器来即时转换命名空间声明。
    • 我最终使用了这种方法,使用了 DOM 模型。由于版本之间的差异不仅仅是命名空间,因此使用 DOM 比使用 SAX 更容易。
    【解决方案2】:

    您可以将 JAXB 实现(Metro、MOXy、JaxMe 等)与 StAX 解析器(RI、Woodstox 等)结合使用来解决此问题。假设除了您的文档向后兼容的名称之外,您还可以将您的对象模型映射到最新的模式。然后,您将欺骗您的 JAXB 实现,使其认为文档的所有版本都在使用该名称空间。诀窍是使用来自 StAX API 的StreamReaderDelegate

    举个类似的例子

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 2012-03-17
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      相关资源
      最近更新 更多