xandross
xandross

Reputation: 911

JAXB marshaller using Java member variable convention

I'm currently trying to figure out why JAXB marshaller uses Java member variable convention as opposed to follow the XmlType annotation.

Here's the situation:

But when I tried to marshal the class back to XML, JAXB converts it to <xmlDocumentType> instead of <XML_DOCUMENT_TYPE>

Any idea why? (If so, how can I fix this?)

Update: to clarify, the issue occurred at the top/root level element, not at the sub element/member variable.

Upvotes: 2

Views: 774

Answers (1)

bdoughan
bdoughan

Reputation: 149037

UPDATE (based on comment by xandross

You can use @XmlRootElement to control the root element name:

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

Alternatively you can wrap the root object in an instance of JAXBElement to supply root element information.


UPDATE (based on comment by Mohamed Mansour)

In JAXB classes correspond to XML types, and fields/properties correspond to XML attributes/elements. This makes sense when you consider there may exist an address type:

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

and multiple elements (with different names) that are of that type:

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

You can control the name of the element/attribute that a property maps to with the @XmlElement/@XmlAttribute annotations:

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

or

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

If the property is not annotated it is treated as @XmlElement and the element name is derived from the property name.

Upvotes: 4

Related Questions