当前位置: 首页 > 知识库问答 >
问题:

将XML绑定到Java类时处理不同的XSD版本

赵驰
2023-03-14

我希望能够向用户公开一个表示XML文件的对象。这可以用许多库(xmlBeans、JAXB…)来完成,并且一切都很好,直到我必须支持该XML文件的不同版本(不断演变的模式问题)以实现向后兼容性。

我希望这对于我的用户来说是完全透明的,这意味着是我的系统需要决定在某个时间点需要使用哪个版本的XML文件。

下面是我想要实现的一个简短的伪代码:

public VersionIndependantObject getVersionSpecificXmlBindedObject() {
    //Determening XSD version and binding XML file to JAVA object
    return javaObject;
}

版本独立对象-这是当时在系统上找到的XML文件的对象表示(可能是v1、v2…)。

有没有办法使用现有的XML库-

共有1个答案

孟意致
2023-03-14

XMLhtml" target="_blank">模式经常会进化,以便向后兼容。这是通过添加可选的新属性和元素来实现的。这意味着旧的XML文档对于新的模式仍然有效。当使用这种策略时,您只需要根据新的XML模式重新生成模型。

如果模型不是向后兼容的,那么事情就更复杂了。

生成模型

您可以为XML模式的每个版本生成一个模型。如果名称空间没有更改,则需要覆盖默认的包名称。

解编组

您可以使用StAX解析器来解析XML,而不是直接对XML进行解组。然后,您可以使用XMLStreamReader获取版本属性并确定要使用的模型。然后将XMLStreamReader解组到该模型中。

我已经这样做了(尽管在解组部分时使用哪个模型背后的逻辑有点不同)。问题是对用户的透明度(返回类型)。直到运行时,我才知道将返回哪个模型。你会怎么处理?

您需要有一个通用的返回类型(即<code>Object</code>),它可以是任何生成的模型,或者像您的问题中一样,有一个特定于版本的方法,每个方法都返回相应的生成模型。我将研究正在使用的模式演化策略。许多人试图向后友好(因为这也有助于他们的处理)。

 类似资料:
  • 我正在尝试这里提供的解决方案https://social.msdn.microsoft.com/forums/en-us/16a91381-0714-4ba1-aff0-7f3b6483b282/populate-a-treeview-from-xsd-file-in-wpf?forum=wpf只采用xs:element和xs:sequence节点,排除所有其他节点(xs:complextype>

  • 我有一个带有REST方法的控制器类,可以抛出各种异常。我已经决定在一个单独的类中处理这些异常,在我的处理程序方法中使用@ControlllerAdwn和@ExceptionHandler。但是,我有一个问题,我的REST方法使用另一个库的注释。此库捕获REST方法引发的异常。现在,我正在全局处理异常,而不是直接通过REST方法中的试/捕获,我的异常总是被其他库捕获,而不是被我自己的处理程序方法捕获

  • 问题内容: 当我运行多线程代码时,系统(linux)有时会将线程从一个处理器移动到另一个处理器。由于我拥有与处理器一样多的线程,因此它没有充分的理由使缓存无效,并且使我的跟踪活动混乱。 您知道如何将线程绑定到处理器,为什么系统会这样做? 问题答案: 使用(这是特定于Linux的)。 为什么调度程序会在不同处理器之间切换线程?好吧,假设您的线程最后一次在处理器1上运行,并且当前正在等待再次安排执行时

  • 问题内容: 事实 在我的Java应用程序中,我必须同时处理具有不同架构版本的XML文件(xsd文件)。XML文件的内容在不同版本之间仅发生了少许变化,因此我想主要使用相同的代码来处理它,并根据所使用架构的版本进行一些区分大小写的操作。 当前解决方案 现在,我正在使用SAX解析器解析XML文件,而我自己忽略了架构版本,只是检查是否存在需要处理的标签。 可能的选择 我真的很想使用JAXB生成用于解析X

  • 问题内容: 您正在使用什么将XML绑定到Java?JAXB,Castor和XMLBeans是一些可用的选择。我所看到的比较都是三到四年了。我愿意接受其他建议。编组/解组性能和易用性特别受关注。 澄清:我不仅要看您使用什么框架,还要看您使用一个框架的理由。 问题答案: JiBX。以前我使用Castor XML,但事实证明JiBX明显更好,特别是在性能方面(从Castor XML到JiBX的一些应用程

  • 最好的办法是什么?根据显示的数据,我希望绑定到MyText1或MyText2。我怎么做“开关”?