我是JaxB World的新人,我正面临一个问题w.r.t.将存储的xml内容解组为java类对象。问题描述如下。如果这是可以解决的,请告诉我 我有我的xsd文件,其中包含以下内容(这只是一个例子) 学生信息
<xs:complexType name="specialization" abstract="true">
</xs:complexType>
<xs:complexType name="Engineering">
<xs:complexContent>
<xs:extension base="specialization">
<xs:sequence>
<xs:element name="percentage" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Medical">
<xs:complexContent>
<xs:extension base="specialization">
<xs:sequence>
<xs:element name="grade" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
现在通过编译xsd生成所有相应的java类。现在让我们假设在我的应用程序中,我将通过构建工程类实例来设置学生信息的特化属性。所以当我保存的所有操作 保存的xml文件将具有如下所示的条目
<Student>
<Name>Name1</Name>
<Specialization>
<percentage>78<percentage>
</Specialization>
</Student>
现在当上述内容用于解组时,解组失败说出了意想不到的元素。我猜这是b'cos专业化元素是类型特化,它调用自身的解组而不是存储的派生对象。
我希望我的解释清楚。有没有什么方法可以根据派生类instanse类型解组。 xsd和bindings.xjb文件完全在我的控制之下,因此我可以添加或修改任何条目/信息,这些条目/信息传达给解组规则以解组派生类。
感谢您的建议,但它仍然不适合我。
这是我试过的
选项#1 - xsi:类型
我的xsd看起来与示例中解释的相同,但仍然是Xsi:type不会出现在xml中。编译时是否需要添加任何其他设置?我应该使用哪个JaxB版本?
选项#2 - 替代组
当我在我的xsd中添加替换条目部分时,XSD编译失败了说重复的名称“工程”和“医疗”。我猜元素名称和类型名称是相同的编译婴儿床(所有工程,医疗,专业化在类型定义和元素名称相同)
我无法修改生成的类,因为我们正在使用模型驱动的体系结构。只有手头的东西是xsd。允许对xsd进行任何修改。理想情况下,第一个选项应该有效。但无法弄清楚为什么它不起作用。如果您有一些建议可以缩小问题,请告诉我。
答案 0 :(得分:1)
使用JAXB时,有多种表示XML继承的方法:
选项#1 - xsi:输入
在此表示中,属性用于指示用于填充此元素的子类型。
<Student>
<Name>Name1</Name>
<Specialization xsi:type="Engineering">
<percentage>78<percentage>
</Specialization>
</Student>
有关详细示例,请参阅:
选项#2 - 替代组
此处元素名称用于表示子类型。这对应于替换组的模式概念,并利用JAXB的@XmlElementRef
注释:
<Student>
<Name>Name1</Name>
<Engineering>
<percentage>78<percentage>
</Engineering>
</Student>
有关详细示例,请参阅: