You are welcome.

Werner

Georg Federmann wrote:
> 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
>>
>>
>>
> 

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to