I have an xsd. In xsd there is a canvas which contains lot of widgets, rows & columns. canvas could be a widget. So inside canvas many widget and canvas exist. My xsd is::::
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.cms.indiatimes.com/Canvas" xmlns:tns="http://www.cms.indiatimes.com/Canvas"
elementFormDefault="qualified">
<xsd:element name="canvas">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="tns:widgetEntry">
<xsd:sequence>
<xsd:element name="widget" type="tns:widgetEntry"
minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="row" type="xsd:integer" minOccurs="1"
maxOccurs="1" />
<xsd:element name="column" type="xsd:integer"
minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="widgetEntry">
<xsd:sequence>
<xsd:element name="ID" type="xsd:int" minOccurs="1"
maxOccurs="1" />
<xsd:element name="templateName" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="cacheTime" type="xsd:integer"
minOccurs="1" maxOccurs="1" />
<xsd:element name="parameter" type="tns:parameter"
minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="visible" type="xsd:boolean" default="false" />
<xsd:element name="canvasSet" type="xsd:boolean" default="false">
<xsd:annotation>
<xsd:documentation xml:lang="en">
indicates if the
widget is also a canvas.
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="position" type="tns:position"
minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="parameter">
<xsd:annotation>
<xsd:documentation xml:lang="en">
The parameter contains
a name, a type and a
value.Based upon type, the
value will need to be
converted into the java type.
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="parameterName" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<xsd:element name="parameterType">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="number" />
<xsd:enumeration value="string" />
<xsd:enumeration value="date" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="parameterValue" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<xsd:element name="minParameterValue" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="maxParameterValue" type="xsd:string"
minOccurs="0" maxOccurs="1" />
<xsd:element name="defaultParameterValue" type="xsd:string"
minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="position">
<xsd:sequence>
<xsd:element name="leftTopCornerRowValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="leftTopCornerColumnValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="leftBottomCornerRowValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="leftBottomCornerColumnValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="rightTopCornerRowValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="rightTopCornerColumnValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="rightBottomCornerRowValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
<xsd:element name="rightBottomCornerColumnValue" type="xsd:int"
minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Now i have written code for marshalling. In this code i have taken two widgets inside root canvas and it is generating xml properly.
public class Main {
public static void main(String[] args) {
Canvas canvas = new Canvas();
canvas.setColumn(new BigInteger("2"));
canvas.setRow(new BigInteger("2"));
List<WidgetEntry> listEntry = canvas.getWidget();
WidgetEntry widget1 = new WidgetEntry();
widget1.setID(1);
widget1.setCacheTime(new BigInteger("5"));
widget1.setCanvasSet(false);
widget1.setTemplateName("Header");
widget1.setVisible(true);
List<Parameter> paramList = widget1.getParameter();
Parameter param = new Parameter();
param.setParameterName("City");
param.setParameterValue("from URL");
param.setParameterType("Number");
paramList.add(param);
listEntry.add(widget1);
WidgetEntry widget2 = new WidgetEntry();
widget2.setID(1);
widget2.setCacheTime(new BigInteger("5"));
widget2.setCanvasSet(false);
widget2.setTemplateName("Menu");
widget2.setCanvasSet(true);
widget2.setVisible(true);
listEntry.add(widget2);
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Canvas.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(canvas, System.out);
} catch (PropertyException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
But when i takes 1 widget and 1 canvas inside root canvas its giving error. Below is my code
public class Main {
public static void main(String[] args) {
Canvas canvas = new Canvas();
canvas.setColumn(new BigInteger("2"));
canvas.setRow(new BigInteger("2"));
List<WidgetEntry> listEntry = canvas.getWidget();
WidgetEntry widget1 = new WidgetEntry();
widget1.setID(1);
widget1.setCacheTime(new BigInteger("5"));
widget1.setCanvasSet(false);
widget1.setTemplateName("Header");
widget1.setVisible(true);
List<Parameter> paramList = widget1.getParameter();
Parameter param = new Parameter();
param.setParameterName("City");
param.setParameterValue("from URL");
param.setParameterType("Number");
paramList.add(param);
listEntry.add(widget1);
Canvas canvas1 = new Canvas();
canvas1.setColumn(new BigInteger("2"));
canvas1.setRow(new BigInteger("2"));
canvas1.setID(1);
canvas1.setCacheTime(new BigInteger("5"));
canvas1.setCanvasSet(false);
canvas1.setTemplateName("Menu");
canvas1.setCanvasSet(true);
canvas1.setVisible(true);
listEntry.add(canvas1);
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Canvas.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(canvas, System.out);
} catch (PropertyException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
And error is:
javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: Instance of "com.til.canvasmaker.xsddto.Canvas" is substituting "com.til.canvasmaker.xsddto.WidgetEntry", but "com.til.canvasmaker.xsddto.Canvas" is bound to an anonymous type.] at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:317) at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243) at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75) at Main.main(Main.java:56) Caused by: com.sun.istack.internal.SAXException2: Instance of "com.til.canvasmaker.xsddto.Canvas" is substituting "com.til.canvasmaker.xsddto.WidgetEntry", but "com.til.canvasmaker.xsddto.Canvas" is bound to an anonymous type. at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:216) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:631) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:54) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:157) at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:141) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:306) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:561) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:290) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:462) at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:314) ... 3 more