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
>
>
>

Reply via email to