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