3

我正在使用 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"/>

如您所见,我有一个元素称为Automobile

Jaxb 创建了我用来创建汽车实例的类和ObjectFactory。让我感到困惑的是创建汽车实例的方法如下:

public JAXBElement<AutomobileType> createAutomobile(AutomobileType value)

为什么createAutomobile方法有参数?我该如何使用这种方法?

我尝试了以下方法:

ObjectFactory objectFactory = new ObjectFactory();
objectFactory.createAutomobile(new Automobile());

但这不会编译,因为汽车类是抽象的,因此我无法创建实例。

4

1 回答 1

2

还有另一种方法:

 public AutomobileType createAutomobileType();

在 JAXB 中,xsd:complexType "AutomobileType" 构造映射同名的类。它是等同于该 XML 模式类型的数据结构。

JAXBElement<> 是一个(参数化的)包装器类型,它将 java 对象与元素名称和名称空间相关联,这就是为什么它的构造函数在构造函数中除了元素名称空间和元素名称之外还需要一个 AutomobileType 对象作为参数。生成的 ObjectFactory "createAutomobile(..)" 只是包装该构造函数的便捷方法,从 XML 模式硬编码命名空间和元素名称。

虽然这种二分法一开始并不完全直截了当,但请考虑您可以使用另一个名称来使用另一个元素

它们在结构上是等效的,但元素名称会不同。您将有另一个 ObjectFactory 方法“createMotorcycle(...)”。

您可以创建一个未命名的汽车类型对象来构建 xml 元素的内容,然后准确地告诉 JAXB 它应该表示为哪个 XML 元素。

我不推荐阅读有关该主题的 JAXB 文档。

于 2013-01-19T06:38:39.467 回答