我使用Jaxb来生成Java类。我的模式定义了以下元素:
<xs:complexType name="AutomobileType" abstract="true">
<xs:sequence>
<xs:element name="Color" type="core:ColorName"/>
<xs:element name="Weight" type="core:PoundsWeightType"/>
<xs:element name="Fuel" type="Fuel"/>
<xs:element name="NumDoors" type="xs:nonNegativeInteger"/>
<xs:element name="NumCylinders">
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="12"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="Automobile" type="AutomobileType"/>正如你所看到的,我有一个元素叫做汽车。
Jaxb创建类和用于创建汽车实例的ObjectFactory。让我困惑的是创建汽车实例的方法如下:
public JAXBElement<AutomobileType> createAutomobile(AutomobileType value)为什么createAutomobile方法有一个参数?我该如何使用这个方法?
我尝试了以下几点:
ObjectFactory objectFactory = new ObjectFactory();
objectFactory.createAutomobile(new Automobile());但是这不能编译,因为汽车类是抽象的,因此我不能创建一个实例。
发布于 2013-01-19 06:38:39
还有另一种方法:
public AutomobileType createAutomobileType();在JAXB中,xsd:complexType "AutomobileType“构造映射同名的类。它是指相当于该XML模式类型的数据结构。
JAXBElement<>是一个(参数化)包装器类型,它将java对象与元素名称和命名空间关联起来,这就是为什么它的构造函数除了元素名称空间和元素名称之外,还在构造函数中接受一个AutomobileType对象作为参数。生成的ObjectFactory“createAutomobile(.)”只是一个方便的方法来包装构造函数,从XML模式硬编码您的名称空间和元素名称。
虽然这种二分法一开始并不都是直截了当的,但考虑一下,您可以使用另一个名称来处理另一个元素。
它们在结构上是等价的,但元素名称则不同。您将有另一个ObjectFactory方法“createMotorcycle(.)”。
您可以创建一个未命名的automobileType对象,用于构建xml元素的内容,然后告诉JAXB它应该表示为哪个XML元素。
我建议您阅读有关这个主题的JAXB文档。
https://stackoverflow.com/questions/14411641
复制相似问题