Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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
JAXB:使用包含较少属性的XSD从Java生成XML_Java_Xml_Jaxb_Xsd - Fatal编程技术网

JAXB:使用包含较少属性的XSD从Java生成XML

JAXB:使用包含较少属性的XSD从Java生成XML,java,xml,jaxb,xsd,Java,Xml,Jaxb,Xsd,我正在寻找一种从Java类中使用通用XML生成器的方法,并能够使用给定的Java类的早期版本生成XML,如果可能的话,使用XSD 例如: 今天,我将使用属性Property1和Property2创建Object1,我将使用JAXB生成它的XSD,并将其命名为Today.XSD。 明天我想将Property3添加到Object1中,我将创建一个新的XSD文件,并将其命名为明天.XSD。在此之后,我希望能够使用Object1的两个版本生成包含数据的XML,使用2个属性或3个属性,如果可能的话,使用生

我正在寻找一种从Java类中使用通用XML生成器的方法,并能够使用给定的Java类的早期版本生成XML,如果可能的话,使用XSD

例如:

今天,我将使用属性
Property1
Property2
创建
Object1
,我将使用JAXB生成它的XSD,并将其命名为Today.XSD。 明天我想将
Property3
添加到
Object1
中,我将创建一个新的XSD文件,并将其命名为明天.XSD。在此之后,我希望能够使用Object1的两个版本生成包含数据的XML,使用2个属性或3个属性,如果可能的话,使用生成的XSD

我的真实案例使用了大量具有大量属性的类,版本控制的数量可能很大。 我希望为每个版本存储XSD,并通过动态指定包含版本号的XSD名称从Java类生成XML


是否可以实现上述需求,或者您是否有类似的解决方案来满足我的需求?

JAXB是一个非常严格的框架,不支持您想要做的事情

当您需要支持同一“对象”的不同版本时,有几种方法

  • 您可以手动解析xml(我指的是使用XPath),这将给您很大的灵活性
  • 另一种方法,在验证中更严格,但需要更多的努力,就是有几个需要手动生成的XSD,然后使用XSLT,您可以将不同的XML消息(通过XSD验证)转换为“标准”XML,而这个XML就是使用JAXB映射的XML。这种模式有一些变体,您可以将不同的版本导入到应用程序期望的版本中

    • 我并不讨厌@Augusto上面的答案,但我认为问题在于用JAXB生成XSD,因为这将是不灵活的。 它不会在所有情况下都起作用,但对于您描述的相对简单的演变,您应该能够(手动)编写一个XSD,以保持与以前XSD的向后兼容性,在以前XSD中,基本上新属性总是可选的。通过从最新的XSD重新生成JAXB类,您应该能够将xml从任何时间点读入最新的JAXB类