Related Stack Overflow Questions:
- How can I add an attribute to a text element in JAXB?
- How to parse <foo value1=“a” value2=“b”>value3</foo> with JAXB?
- XML element with attribute and content using JAXB
With @XmlValue
XML Schema
Below is an example of a complex type with simple content. Essentially this means that the phone-number element will behave similar to an element with type string, except that it may have an attribute called type.
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="phone-number"> <complexType> <simpleContent> <extension base="string"> <attribute name="type" type="string"/> </extension> </simpleContent> </complexType> </element> </schema>
Java Model
In JAXB we use the @XmlValue annotation to map the number property to the text portion of the phone-number element.
package blog.xmlvalue; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlValue; @XmlRootElement(name="phone-number") public class PhoneNumber { private String type; private String number; @XmlAttribute public String getType() { return type; } public void setType(String type) { this.type = type; } @XmlValue public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
XML
Below is a sample XML document produced using the PhoneNumber object (with the number property annotated with @XmlValue) that conforms to our target XML schema.
<?xml version="1.0" encoding="UTF-8"?> <phone-number type="work">555-1234</phone-number>
Without @XmlValue
XML Schema
If we do not use the @XmlValue annotation then the number property will be treated as an XML element.
If we do not use the @XmlValue annotation then the number property will be treated as an XML element.
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema"> <element name="phone-number"> <complexType> <sequence> <element name="number" type="string"/> </sequence> <attribute name="type" type="string"/> </complexType> </element> </schema>
Java Model
In our Java model we have not annotated the number property so it will be treated as @XmlElement.
package blog.xmlvalue; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="phone-number") public class PhoneNumber { private String type; private String number; @XmlAttribute public String getType() { return type; } public void setType(String type) { this.type = type; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
XML
Below is a sample XML document produced using the PhoneNumber object (with the number property not annotated with @XmlValue) that conforms to our target XML schema.
<?xml version="1.0" encoding="UTF-8"?> <phone-number type="work"> <number>555-1234</number> </phone-number>
Demo Code
The following demo code can be used to run this example:
package blog.xmlvalue; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(PhoneNumber.class); PhoneNumber phoneNumber = new PhoneNumber(); phoneNumber.setType("work"); phoneNumber.setNumber("555-1234"); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(phoneNumber, System.out); } }
Further Reading
If you enjoyed this post, then you may also be interested in:
It is good tutorial helped me solve my problem for which I was trying from last 24 hours
ReplyDeleteNicely explained...!
ReplyDelete