Hi Werner,
thank you very much, that's exactly what I was looking for.
Wow, the solution is even very clear and keeping things simple.
best regards,
Georg
On Wed, Jun 11, 2008 at 11:24 AM, Werner Guttmann <[EMAIL PROTECTED]>
wrote:
> Georg,
>
> the following mapping does the trick (for me).
>
> <mapping>
> <class name="xml.georg2.Data">
> <map-to xml="data" />
> <field name="data" type="xml.georg2.A" collection="array">
> <bind-xml name="a" node="element" />
> </field>
> </class>
> <class name="xml.georg2.A">
> <field name="field" type="xml.georg2.B" container="true"
> collection="array">
> <bind-xml name="value" node="element" />
> </field>
> <field name="id" type="xml.georg2.C" container="true">
> <bind-xml name="c" />
> </field>
> </class>
> <class name="xml.georg2.B">
> <field name="value" type="integer" />
> </class>
> <class name="xml.georg2.C">
> <field name="id" type="java.lang.String">
> <bind-xml name="id" node="attribute"/>
> </field>
> <field name="name" type="java.lang.String">
> <bind-xml name="name" node="attribute"/>
> </field>
> </class>
> </mapping>
>
> Regards
> Werner
>
> Georg Federmann wrote:
> > Hello Werner,
> >
> > sorry, my mistake! The example data model was incorrect. In fact, the A
> type
> > has multiple references to data carrying objects of type B and one
> reference
> > to one object of type C, carrying various informations identifying the A
> > type object. So there is one C object for each A object, and the fields
> of
> > this C object shall be used for the attributes of the <a> element.
> >
> > Sorry for the false data model before. For more clearance I've added some
> > example data. I tried to keep the example data as concise as possible.
> >
> > thank you for your help,
> > best regards, Georg
> >
> > the mapping xml:
> > <mapping>
> > <class name="ab.Data">
> > <map-to xml="data"/>
> > <field name="data" type="ab.A" collection="array">
> > <bind-xml name="a" node="element"/>
> > </field>
> > </class>
> > <class name="ab.A">
> > <field name="field" type="ab.B" container="true"
> collection="array">
> > <bind-xml name="value" node="element"/>
> > </field>
> > <field name="id" type="ab.C" container="true">
> > <bind-xml name="id" node="attribute"/>
> > </field>
> > </class>
> > <class name="ab.B">
> > <field name="value" type="integer"/>
> > </class>
> > <class name="ab.C">
> > <field name="id" type="java.lang.String">
> > <bind-xml name="id"/>
> > </field>
> > </class>
> > </mapping>
> >
> > Castor's result:
> > <data>
> > <a id="[EMAIL PROTECTED]">
> > <value>15</value>
> > <value>8</value>
> > </a>
> > <a id="[EMAIL PROTECTED]">
> > <value>12</value>
> > <value>17</value>
> > <value>8</value>
> > <value>3</value>
> > </a>
> > </data>
> >
> > how I would need it:
> > <data>
> > <a id="C1" name="series1">
> > <value>15</value>
> > <value>8</value>
> > </a>
> > <a id="C2" name="series2">
> > <value>12</value>
> > <value>17</value>
> > <value>8</value>
> > <value>3</value>
> > </a>
> > </data>
> >
> > the data model:
> > public class A {
> > private B[] field;
> > private C id;
> >
> > public A () {};
> >
> > public A ( B[] bs, C id ){
> > setField ( bs );
> > setId ( id );
> > }
> >
> > public B[] getField () {
> > return field;
> > }
> >
> > public void setField ( B[] field ) {
> > this.field = field;
> > }
> >
> > public C getId () {
> > return id;
> > }
> >
> > public void setId ( C id ) {
> > this.id = id;
> > }
> > }
> >
> > public class C {
> > private String id;
> > private String name;
> >
> > public C (){}
> >
> > public C ( String id, String name ){
> > setId ( id );
> > setName ( name );
> > }
> >
> > public String getId () {
> > return id;
> > }
> > public void setId ( String id ) {
> > this.id = id;
> > }
> > public String getName () {
> > return name;
> > }
> > public void setName ( String name ) {
> > this.name = name;
> > }
> > }
> >
> > public class B {
> > private String id;
> > private int value;
> >
> > public B (){}
> >
> > public B ( int val, String id ){
> > setId ( id );
> > setValue ( val );
> > }
> >
> > public String getId () {
> > return id;
> > }
> >
> > public void setId ( String id ) {
> > this.id = id;
> > }
> >
> > public int getValue () {
> > return value;
> > }
> >
> > public void setValue ( int value ) {
> > this.value = value;
> > }
> > }
> >
> > public class MarshalTest {
> > public static void main ( String[] args ) throws IOException,
> > MappingException, MarshalException, ValidationException {
> > Mapping mapping = new Mapping ();
> > mapping.loadMapping ( "resources/abMapping.xml" );
> >
> > B[] b1 = new B[] { new B ( 15, "val1" ), new B ( 8, "val2" ) };
> > B[] b2 = new B[] { new B ( 12, "val3" ), new B ( 17, "val4" ),
> new B
> > ( 8, "val5" ), new B ( 3, "val6" ) };
> > C series1 = new C ( "C1", "series1" );
> > C series2 = new C ( "C2", "series2" );
> > A[] a1 = new A[] { new A ( b1, series1 ), new A ( b2, series2 )
> };
> > Data data = new Data ( a1 );
> >
> > StringWriter writer = new StringWriter ();
> > Marshaller marshaller = new Marshaller ( writer );
> > marshaller.setMapping ( mapping );
> > marshaller.marshal ( data );
> >
> > System.out.println ( writer.toString () );
> > Writer output = new FileWriter ( new File (
> "resources/abResult.xml"
> > ) );
> > output.write ( writer.toString () );
> > output.flush ();
> > output.close ();
> > }
> > }
> >
> > On Mon, Jun 9, 2008 at 12:54 PM, Werner Guttmann <
> [EMAIL PROTECTED]>
> > wrote:
> >
> >> Personally, I would move the 'id' attribute to the A class, as that's
> >> where it belongs to (semantically).
> >>
> >> Werner
> >>
> >> Werner Guttmann wrote:
> >>> Georg,
> >>>
> >>> I don't think it's possible to map a 'multi-valued' field such as the
> >>> 'id' field of B to a single occurence within the XML output.
> >>>
> >>> Werner
> >>>
> >>> Georg Federmann wrote:
> >>>> Hello Werner,
> >>>>
> >>>> thanks a lot for your reply!
> >>>> Here is the mapping as I am using it right now:
> >>>>
> >>>> <mapping>
> >>>> <class name="ab.Data">
> >>>> <map-to xml="data"/>
> >>>> <field name="data" type="ab.A" collection="array">
> >>>> <bind-xml name="a" node="element"/>
> >>>> </field>
> >>>> </class>
> >>>>
> >>>> <class name="ab.A">
> >>>> <field name="field" type="ab.B" container="true"
> >> collection="array">
> >>>> <bind-xml name="value" node="element"/>
> >>>> </field>
> >>>> </class>
> >>>>
> >>>> <class name="ab.B">
> >>>> <field name="value" type="integer"/>
> >>>> </class>
> >>>> </mapping>
> >>>>
> >>>> and this is the result generated by Castor:
> >>>>
> >>>> <data>
> >>>> <a>
> >>>> <value>15</value>
> >>>> <value>8</value>
> >>>> </a>
> >>>> <a>
> >>>> <value>12</value>
> >>>> <value>17</value>
> >>>> <value>8</value>
> >>>> <value>3</value>
> >>>> </a>
> >>>> </data>
> >>>>
> >>>> this is as far as I got, and it's already very beautiful. But the
> >> crucial
> >>>> step is to get the "id" field of the B type into the "id" attribute of
> >> the
> >>>> <a> element like in
> >>>>
> >>>> <data>
> >>>> <a id="series1">
> >>>> <value>15</value>
> >>>> <value>8</value>
> >>>> </a>
> >>>> <a id="series2">
> >>>> <value>12</value>
> >>>> <value>17</value>
> >>>> <value>8</value>
> >>>> <value>3</value>
> >>>> </a>
> >>>> </data>
> >>>>
> >>>> I'm very grateful for any help here!
> >>>>
> >>>> best regards, Georg
> >>>>
> >>>> I've added the sources of the java types, maybe it's of any help ...
> >>>>
> >>>> package ab;
> >>>> public class A {
> >>>> private B[] field;
> >>>>
> >>>> public A () {};
> >>>>
> >>>> public A ( B[] bs ){
> >>>> setField ( bs );
> >>>> }
> >>>>
> >>>> public B[] getField () {
> >>>> return field;
> >>>> }
> >>>>
> >>>> public void setField ( B[] field ) {
> >>>> this.field = field;
> >>>> }
> >>>> }
> >>>>
> >>>> package ab;
> >>>> public class B {
> >>>> private String id;
> >>>> private int value;
> >>>>
> >>>> public B (){}
> >>>>
> >>>> public B ( int val, String id ){
> >>>> setId ( id );
> >>>> setValue ( val );
> >>>> }
> >>>>
> >>>> public String getId () {
> >>>> return id;
> >>>> }
> >>>>
> >>>> public void setId ( String id ) {
> >>>> this.id = id;
> >>>> }
> >>>>
> >>>> public int getValue () {
> >>>> return value;
> >>>> }
> >>>>
> >>>> public void setValue ( int value ) {
> >>>> this.value = value;
> >>>> }
> >>>> }
> >>>>
> >>>> package ab;
> >>>> public class Data {
> >>>> private A[] data;
> >>>>
> >>>> public Data (){};
> >>>>
> >>>> public Data ( A[] data ){
> >>>> setData ( data );
> >>>> }
> >>>>
> >>>> public A[] getData () {
> >>>> return data;
> >>>> }
> >>>>
> >>>> public void setData ( A[] data ) {
> >>>> this.data = data;
> >>>> }
> >>>> }
> >>>>
> >>>> package ab;
> >>>> public class MarshalTest {
> >>>>
> >>>> public static void main ( String[] args ) throws IOException,
> >>>> MappingException, MarshalException, ValidationException {
> >>>> Mapping mapping = new Mapping ();
> >>>> mapping.loadMapping ( "resources/abMapping.xml" );
> >>>>
> >>>> B[] b1 = new B[] { new B ( 15, "series1" ), new B ( 8,
> "series1"
> >> )
> >>>> };
> >>>> B[] b2 = new B[] { new B ( 12, "series2" ), new B ( 17,
> >> "series2" ),
> >>>> new B ( 8, "series2" ), new B ( 3, "series2" ) };
> >>>> A[] a1 = new A[] { new A ( b1 ), new A ( b2 ) };
> >>>> Data data = new Data ( a1 );
> >>>>
> >>>> StringWriter writer = new StringWriter ();
> >>>> Marshaller marshaller = new Marshaller ( writer );
> >>>> marshaller.setMapping ( mapping );
> >>>> marshaller.marshal ( data );
> >>>>
> >>>> System.out.println ( writer.toString () );
> >>>> Writer output = new FileWriter ( new File (
> >> "resources/abResult.xml"
> >>>> ) );
> >>>> output.write ( writer.toString () );
> >>>> output.flush ();
> >>>> output.close ();
> >>>> }
> >>>> }
> >>>>
> >>>>
> >>>>
> >>>> On Mon, Jun 9, 2008 at 10:13 AM, Werner Guttmann <
> >> [EMAIL PROTECTED]>
> >>>> wrote:
> >>>>
> >>>>> Georg,
> >>>>>
> >>>>> what does your mapping file look like right now ? How have you tried
> to
> >>>>> map A and Bs ?
> >>>>>
> >>>>> Having said that, I guess this might be achievable, but I am not 100%
> >>>>> sure. Basically, you will have to use the container attribute (set to
> >>>>> false) on the class mapping for 'B', so that no <B> tags will be
> >>>>> rendered. Whether this will work with your additional requirement on
> >> the
> >>>>> aggregation by the value of the id attribute of B, not sure.
> >>>>>
> >>>>> Regards
> >>>>> Werner
> >>>>>
> >>>>> Georg Federmann wrote:
> >>>>>> Hi all,
> >>>>>>
> >>>>>> I need to marshal a given object model to a given xml, but I can't
> >>>>> persuade
> >>>>>> Castor to do as needed.
> >>>>>> This is the problem:
> >>>>>> I have two java types A and B where B has a field "id" and A holds
> >>>>>> references to B. Now I need the field "id" of B as an attribute of
> the
> >>>>> xml
> >>>>>> element <a>, that represents A.
> >>>>>>
> >>>>>> class A{
> >>>>>> B[] field;
> >>>>>> }
> >>>>>>
> >>>>>> class B{
> >>>>>> String id;
> >>>>>> int value;
> >>>>>> }
> >>>>>>
> >>>>>> a collection of objects of type A shall be marshalled to some xml
> like
> >>>>> this:
> >>>>>> <data>
> >>>>>> <a id="b1">
> >>>>>> <value>15</value>
> >>>>>> <value>8</value>
> >>>>>> </a>
> >>>>>> <a id="b2">
> >>>>>> <value>12</value>
> >>>>>> <value>17</value>
> >>>>>> <value>8</value>
> >>>>>> <value>3</value>
> >>>>>> </a>
> >>>>>> </data>
> >>>>>>
> >>>>>> Somehow I can't see, how I can split the fields of the B type into
> an
> >>>>>> attribute "id" of the <a> element and a child element <value> of the
> >> <a>
> >>>>>> element.
> >>>>>>
> >>>>>>
> >>>>>> I appreciate any help
> >>>>>>
> >>>>>> best regards, Georg
> >>>>>>
> >>>>> ---------------------------------------------------------------------
> >>>>> To unsubscribe from this list, please visit:
> >>>>>
> >>>>> http://xircles.codehaus.org/manage_email
> >>>>>
> >>>>>
> >>>>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe from this list, please visit:
> >>>
> >>> http://xircles.codehaus.org/manage_email
> >>>
> >>>
> >> ---------------------------------------------------------------------
> >> To unsubscribe from this list, please visit:
> >>
> >> http://xircles.codehaus.org/manage_email
> >>
> >>
> >>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
> http://xircles.codehaus.org/manage_email
>
>
>