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