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


Reply via email to