We would like to know how to read/write multilevel xml file via Jaxb.
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.serus.com" xmlns:ns1="http://www.serus.com"> <xs:element name="part"> <xs:complexType> <xs:sequence minOccurs="1" maxOccurs="1"> <xs:element ref="ns1:Product_Number"/> <xs:element ref="ns1:Product_Type"/> <xs:element ref="ns1:Product_Version"/> <xs:element ref="ns1:Status"/> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="ns1:part"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Product_Number" type="xs:NCName"/> <xs:element name="Product_Type" type="xs:NCName"/> <xs:element name="Product_Version" type="xs:NCName"/> <xs:element name="Status" type="xs:NCName"/> </xs:schema>
Java code:
import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; //from ww w . j av a 2s . co m import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @XmlRootElement(name = "part") public class Product implements Serializable { public static Product fromXML(InputStream in) throws Exception { JAXBContext context = JAXBContext.newInstance(Product.class); Unmarshaller um = context.createUnmarshaller(); return (Product) um.unmarshal(in); } private static final long serialVersionUID = 1L; @XmlElement(name = "Product_Number") private String partNumber; @XmlElement(name = "Product_Type") private String partType; @XmlElement(name = "Product_Version") private String partVersion; @XmlElement(name = "Status") private String status; @XmlElement(name = "part") private Collection<Product> subProducts = null; public static void main(String args[]) throws JAXBException { Product mainProduct = new Product("1m", "m", "1", "draft"); Product level1 = new Product("l1", "l1", "11", "new"); level1.addProduct(new Product("l2", "l2", "1", "new")); level1.addProduct(new Product("l2-2", "l2", "1", "new")); mainProduct.addProduct(level1); System.out.println(mainProduct.toXML()); } public Product() { } public Product(String no, String type, String ver, String stat) { this.partNumber = no; this.partType = type; this.partVersion = ver; this.status = stat; } @XmlTransient public String getProductNumber() { return this.partNumber; } public void setProductNumber(String partNumber) { this.partNumber = partNumber; } @XmlTransient public String getProductType() { return this.partType; } public void setProductType(String partType) { this.partType = partType; } @XmlTransient public String getProductVersion() { return this.partVersion; } public void setProductVersion(String partVersion) { this.partVersion = partVersion; } @XmlTransient public String getStatus() { return this.status; } public void setStatus(String status) { this.status = status; } @XmlTransient public Collection<Product> getSubparts() { return this.subProducts; } public void setSubparts(Collection<Product> subparts) { this.subProducts = subparts; } public void addProduct(Product part) { if (this.subProducts == null) { this.subProducts = new ArrayList<Product>(); } this.subProducts.add(part); } public void addProducts(Collection<Product> parts) { if (this.subProducts == null) { this.subProducts = new ArrayList<Product>(); } this.subProducts.addAll(parts); } public String toXML() throws JAXBException { ByteArrayOutputStream out = new ByteArrayOutputStream(); JAXBContext context = JAXBContext.newInstance(Product.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(this, out); return out.toString(); } }