[Java] Generate XML From XSD using xjc
For example i have an xsd, and i want to generate an XML based on it using java. This is my xsd example, and i save it as “my.xsd”
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/PurchaseOrderSchema.xsd" targetNamespace="http://tempuri.org/PurchaseOrderSchema.xsd" elementFormDefault="qualified"> <xsd:element name="PurchaseOrder" type="tns:PurchaseOrderType"/> <xsd:complexType name="PurchaseOrderType"> <xsd:sequence> <xsd:element name="ShipTo" type="tns:USAddress" maxOccurs="2"/> <xsd:element name="BillTo" type="tns:USAddress"/> </xsd:sequence> <xsd:attribute name="OrderDate" type="xsd:date"/> </xsd:complexType> <xsd:complexType name="USAddress"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="state" type="xsd:string"/> <xsd:element name="zip" type="xsd:integer"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/> </xsd:complexType> </xsd:schema>
Next step is generate java bean using xjc using below command
xjc -p com.edw.bean my.xsd
And it will gives below output,
parsing a schema... compiling a schema... com\edw\bean\ObjectFactory.java com\edw\bean\PurchaseOrderType.java com\edw\bean\USAddress.java com\edw\bean\package-info.java
Import those generated java files, and print a simple xml on console based on it.
package com.edw; import com.edw.bean.ObjectFactory; import com.edw.bean.PurchaseOrderType; import com.edw.bean.USAddress; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Marshaller; import javax.xml.datatype.DatatypeFactory; import java.math.BigInteger; import java.util.Date; public class Main { public static void main(String[] args) throws Exception { new Main().doSomething(); } private void doSomething() throws Exception { PurchaseOrderType purchaseOrderType = new PurchaseOrderType(); USAddress address = new USAddress(); address.setCity("aaa"); address.setCountry("US"); address.setName("cccc"); address.setState("dddd"); address.setStreet("eee"); address.setZip(BigInteger.ONE); purchaseOrderType.setBillTo(address); purchaseOrderType.getShipTo().add(address); purchaseOrderType.setOrderDate(DatatypeFactory.newInstance().newXMLGregorianCalendar(new Date().toInstant().toString())); JAXBElement<PurchaseOrderType> element = new ObjectFactory().createPurchaseOrder(purchaseOrderType); toXml(element); } private void toXml(JAXBElement<PurchaseOrderType> element) throws Exception { JAXBContext ctx = JAXBContext.newInstance(PurchaseOrderType.class); Marshaller marshaller = ctx.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(element, System.out); } }
It will print below output,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <PurchaseOrder xmlns="http://tempuri.org/PurchaseOrderSchema.xsd" OrderDate="2019-11-11Z"> <ShipTo country="US"> <name>cccc</name> <street>eee</street> <city>aaa</city> <state>dddd</state> <zip>1</zip> </ShipTo> <BillTo country="US"> <name>cccc</name> <street>eee</street> <city>aaa</city> <state>dddd</state> <zip>1</zip> </BillTo> </PurchaseOrder>
Final step is we can validate our generated xml with provided xsd, and see whether generated xml is valid.
No Comments