我目前正试图弄清楚JAXB marshaller为什么使用Java成员变量约定,而不是遵循XmlType注释。
情况如下:
- 第三方给了我们XSD
- 我们使用JDK工具生成Java类
- 生成的Java类生成了正确的注释:@XmlType(name="XML_DOCUMENT_TYPE")
但是,当我尝试将类封送回XML时,JAXB将其转换为<xmlDocumentType>
而不是<XML_DOCUMENT_TYPE>
知道为什么吗?(如果是,我该如何修复?)
更新:为了澄清,问题发生在顶层/根级元素,而不是子元素/成员变量。
更新(基于xandros的评论
您可以使用@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
,并且元素名称源自特性名称。