<?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();
}
}