JAXB marshaller使用Java成员变量约定

时间:2011-06-08 00:34:37

标签: java xml xsd jaxb

我目前正试图弄清楚为什么JAXB marshaller使用Java成员变量约定而不是遵循XmlType注释。

情况如下:

  • 第三方给了我们XSD
  • 我们使用JDK工具生成Java类
  • 生成的Java类生成了正确的注释:@XmlType(name =“XML_DOCUMENT_TYPE”)

但是当我尝试将类封送回XML时,JAXB将其转换为<xmlDocumentType>而不是<XML_DOCUMENT_TYPE>

知道为什么吗? (如果是这样,我该如何解决这个问题?)

更新:澄清一下,问题发生在顶层/根级别元素,而不是子元素/成员变量。

1 个答案:

答案 0 :(得分:4)

更新(根据xandross的评论

您可以使用@XmlRootElement来控制根元素名称:

@XmlRootElement(name="XML_DOCUMENT_TYPE")
public class Foo {
  ...
}

或者,您可以将根对象包装在JAXBElement的实例中以提供根元素信息。


更新(根据Mohamed Mansour的评论)

在JAXB中,类对应于XML类型,而字段/属性对应于XML属性/元素。当您考虑可能存在地址类型时,这是有道理的:

<xs:complexType name="address">
    <xs:sequence>
        <xs:element name="street" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

和该类型的多个元素(具有不同的名称):

<xs:complexType name="customer">
    <xs:sequence>
        <xs:element name="billing-address type="address"/>
        <xs:element name="shipping-address type="address"/>
    </xs:sequence>
</xs:complexType>

您可以使用@XmlElement / @XmlAttribute注释控制属性映射到的元素/属性的名称:

@XmlElement(name="shipping-address")
public getShippingAddress() {
    return shippingAddress;
}

@XmlElement(name="ShippingAddress")
public getShippingAddress() {
    return shippingAddress;
}

如果未对该属性进行注释,则将其视为@XmlElement,并且元素名称是从属性名称派生的。