By default when marshaling to xml file, all properties are marshaled as elements. This default behaviour can be changed and this post explains how to do it.
In this post I will marshall the below java bean class, and id property as its attribute.
Country
1 package package1;
2
3 import javax.xml.bind.annotation.XmlAttribute;
4 import javax.xml.bind.annotation.XmlRootElement;
5
6 @XmlRootElement
7 public class Country {
8 private int id;
9 private String name;
10 private int population;
11
12 @XmlAttribute
13 public int getId() {
14 return id;
15 }
16 public void setId(int id) {
17 this.id = id;
18 }
19 public String getName() {
20 return name;
21 }
22 public void setName(String name) {
23 this.name = name;
24 }
25 public int getPopulation() {
26 return population;
27 }
28 public void setPopulation(int population) {
29 this.population = population;
30 }
31
32 @Override
33 public String toString() {
34 StringBuilder sb = new StringBuilder();
35 sb.append("{");
36 sb.append("name:").append(this.name).append(",");
37 sb.append("population:").append(this.population).append("}");
38
39 return sb.toString();
40 }
41 }
Since I want the id property as an attribute, I mark the getter method with XmlAttribute annotation. Any getter annotated with this annotation will be stored as element’s attribute.
Main Code
package package1;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class XMLAttributeDemo {
public static void main(String[] args) throws JAXBException, IOException {
JAXBContext jaxbContext = JAXBContext.newInstance(Country.class);
Marshaller marshaller = jaxbContext.createMarshaller();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Country country = new Country();
country.setId(1);
country.setName("India");
country.setPopulation(10000000);
File file = new File("result.xml");
FileWriter fw = new FileWriter(file);
marshaller.marshal(country, fw);
}
}
Output
<?xml version=”1.0″ encoding=”UTF-8″ standalone=”yes”?>
<country id=”1″>
<name>India</name>
<population>10000000</population>
</country>
Explanation
From the output we can see that id property is marshalled as attribute of country element instead of an element itself.