xml - Jaxb and unmarshalling included XSD -
i have 2 xsds 1 xsd contains element can contain elements second one. basically, xsd 1 has element "etta" can contain element xsd 2.
i used xjc generate classes, , when deserialized, meta element contains elements xsd 2 jaxbelements instead of actual classes generated xsd 2. included both sets of classes program, , package-info correct.
this how defined xsd. imagine problem "any" element.
<xs:schema xmlns="ns1" elementformdefault="qualified" xmlns:ns1="ns2" targetnamespace="ns1" xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:import namespace="ns2" schemalocation="./ns2.xsd" /> <xs:complextype name="meta"> <xs:sequence> <xs:any namespace="ns2" minoccurs="1" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> ... </xs:schema>
so want element mean "here goes 1 or more elements defined in xsd2" , jaxb unmarshall it.
how should change xsd jaxb deserialize contents of meta using elements xsd2?
--edit-
this xjc generated meta class:
@xmlaccessortype(xmlaccesstype.field) @xmltype(name = "meta", proporder = { "any" }) public class meta extends baseobject { @xmlanyelement(lax = true) protected list<object> any; public list<object> getany() { if (any == null) { = new arraylist<object>(); } return this.any; } }
-- edit original xsd2 (changed ns match question) --
<xs:schema xmlns="ns2" elementformdefault="qualified" targetnamespace="syncml:ns2" xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="metinf"> <xs:complextype> <xs:sequence> <xs:element minoccurs="0" maxoccurs="1" ref="fieldlevel" /> <xs:element minoccurs="0" maxoccurs="1" ref="format" /> <xs:element minoccurs="0" maxoccurs="1" ref="type" /> <xs:element minoccurs="0" maxoccurs="1" ref="mark" /> <xs:element minoccurs="0" maxoccurs="1" ref="size" /> <xs:element minoccurs="0" maxoccurs="1" ref="anchor" /> <xs:element minoccurs="0" maxoccurs="1" ref="version" /> <xs:element minoccurs="0" maxoccurs="1" ref="nextnonce" /> <xs:element minoccurs="0" maxoccurs="1" ref="maxmsgsize" /> <xs:element minoccurs="0" maxoccurs="1" ref="maxobjsize" /> <xs:element minoccurs="0" maxoccurs="unbounded" ref="emi" /> <xs:element minoccurs="0" maxoccurs="1" ref="mem" /> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="fieldlevel"> <xs:complextype /> </xs:element> <xs:element name="format" type="xs:string" /> <xs:element name="type" type="xs:string" /> <xs:element name="mark" type="xs:string" /> <xs:element name="size" type="xs:string" /> <xs:element name="anchor"> <xs:complextype> <xs:sequence> <xs:element minoccurs="0" maxoccurs="1" ref="last" /> <xs:element ref="next" /> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="last" type="xs:string" /> <xs:element name="next" type="xs:string" /> <xs:element name="version" type="xs:string" /> <xs:element name="nextnonce" type="xs:string" /> <xs:element name="maxmsgsize" type="xs:string" /> <xs:element name="maxobjsize" type="xs:string" /> <xs:element name="emi" type="xs:string" /> <xs:element name="mem"> <xs:complextype> <xs:sequence> <xs:element minoccurs="0" maxoccurs="1" ref="sharedmem" /> <xs:element ref="freemem" /> <xs:element ref="freeid" /> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="freeid" type="xs:string" /> <xs:element name="freemem" type="xs:string" /> <xs:element name="sharedmem"> <xs:complextype /> </xs:element> </xs:schema>
-- how meta being used in xsd1:
<xs:element name="targetref" type="xs:string" /> <xs:element name="verdtd" type="xs:string" /> <xs:element name="verproto" type="xs:string" /> <xs:element name="item"> <xs:complextype> <xs:sequence> <xs:element minoccurs="0" maxoccurs="1" ref="target" /> <xs:element minoccurs="0" maxoccurs="1" ref="source" /> <xs:element minoccurs="0" maxoccurs="1" ref="sourceparent" /> <xs:element minoccurs="0" maxoccurs="1" ref="targetparent" /> <xs:element minoccurs="0" maxoccurs="1" ref="meta" /> <xs:element minoccurs="0" maxoccurs="1" ref="data" /> <xs:element minoccurs="0" maxoccurs="1" ref="moredata" /> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="meta" type="xs:string" /> <xs:element name="correlator" type="xs:string" /> <xs:element name="data" type="xs:string" />
how sth. this:
inserting possible elements second xsd sequence while defining minoccurs , maxoccurs in sequence instead of elements themselves. (the code here - example 2)
<xs:element name="meta"> <xs:complextype> <xs:sequence minoccurs="1" maxoccurs="unbounded"> <xs:element name="elements" type="ns1:typea"/> <xs:element name="from" type="ns1:typeb"/> <xs:element name="ns2" type="ns1:typec"/> </xs:sequence> </xs:complextype> </xs:element>
another option require changing second xsd little bit:
instead of line 2-4 looking this:
<xs:element name="metinf"> <xs:complextype> <xs:sequence>
they have this:
<xs:complextype name="metinf"> <xs:sequence>
and ns1.xsd this:
<xs:schema xmlns="ns1" elementformdefault="qualified" targetnamespace="ns1" xmlns:xs="http://www.w3.org/2001/xmlschema" xmlns:ns1="ns2"> <xs:import namespace="ns2" schemalocation="ns2.xsd" /> <xs:complextype name="meta"> <xs:sequence> <xs:element name="metainf" type="ns1:metinf" minoccurs="1" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype>
when running xjc firstschema.xsd , ns2.xsd in same directory following classes generated:
ns2/anchor.java ns2/fieldlevel.java ns2/mem.java ns2/metinf.java ns2/objectfactory.java ns2/sharedmem.java ns2/package-info.java ns1/meta.java ns1/objectfactory.java ns1/package-info.java
the meta class firstschema.xsd looks this:
public class meta { @xmlelement(required = true) protected list<metinf> metainf; public list<metinf> getmetainf() { if (metainf == null) { metainf = new arraylist<metinf>(); } return this.metainf; } }
is anywhere near need?
Comments
Post a Comment