> Pezzotti Damiano wrote:
>
> Hi,
> I have a problem.
>
> I have this XML code :
>
> <PAGE>
> <DAY>
> <NUMBER>05</NUMBER>
> <DATE>2002-03-17</DATE>
> <DAY>
> ......
>
>
>
> I have the object Page that has 2 fields , number and date, but I
> haven't
> the ogject Day.
>
> How can I write the mapping file?
>
> <mapping>
> <class name="Page">
> <map-to xml="PAGE"/>
>
> <field name="date" type="java.lang.String">
> <bind-xml name="??????" />
> </field>
>
> <field name="number" type="java.lang.String">
> <bind-xml name="???" />
> </field>
>
Currently, "wrapper elements" are not supported. So you'll need to do
some
extra work to get it working.
1. You can use XSLT to remove (unwrap) the <DAY> element.
2. -Or- you can create a Day object for your object model.
3. -Or- you can use a special FieldHandler so that the Day object is not
needed
for your object model, only for unmarshalling and marshalling.
I think number 3 is the best approach because it doesn't require
altering your XML or
your object model.
To use number 3...
1. create a Day object (only used for marshalling/unmarshalling,
not part of the object model)
2. create a FieldHandler as such:
---
import org.exolab.castor.mapping.FieldHandler;
import org.exolab.castor.mapping.ValidityException;
/**
* The FieldHandler for the "day wrapper" field of the Page class.
**/
public class DayHandler
implements org.exolab.castor.mapping.FieldHandler
{
/**
* Creates a new DayHandler for the Page class
**/
public DayHandler() {
super();
}
/**
* Returns the value of the field from the object.
*
* @param object The object
* @return The value of the field
* @throws IllegalStateException The Java object has changed and
* is no longer supported by this handler, or the handler is not
* compatiable with the Java object
*/
public Object getValue( Object object )
throws IllegalStateException
{
Page page = (Page)object;
Day day = new Day();
day.setDate(page.getDate());
day.setNumber(page.getNumber());
return day;
}
/**
* Sets the value of the field on the object.
*
* @param object The object
* @param value The new value
* @throws IllegalStateException The Java object has changed and
* is no longer supported by this handler, or the handler is not
* compatiable with the Java object
* @thorws IllegalArgumentException The value passed is not of
* a supported type
*/
public void setValue( Object object, Object value )
throws IllegalStateException, IllegalArgumentException
{
Page page = (Page)object;
Day day = (Day)value;
page.setDate(day.getDate());
page.setNumber(day.getNumber());
}
/**
* Sets the value of the field to a default value.
* <p>
* Reference fields are set to null, primitive fields are set to
* their default value, collection fields are emptied of all
* elements.
*
* @param object The object
* @throws IllegalStateException The Java object has changed and
* is no longer supported by this handler, or the handler is not
* compatiable with the Java object
*/
public void resetValue( Object object )
throws IllegalStateException, IllegalArgumentException
{
//-- add reset code here
}
/**
* @deprecated No longer supported
*/
public void checkValidity( Object object )
throws ValidityException, IllegalStateException
{
//-- add validation check if desired
}
/**
* Creates a new instance of the object described by this field.
*
* @param parent The object for which the field is created
* @return A new instance of the field's value
* @throws IllegalStateException This field is a simple type and
* cannot be instantiated
*/
public Object newInstance( Object parent )
throws IllegalStateException
{
return new Day();
}
}
---
3. modify your mapping as such:
<mapping>
<class name="Page">
<map-to xml="PAGE"/>
<field name="day" type="Day" handler="DayHandler">
<bind-xml name="DAY"/>
</field>
</class>
</mapping>
Hope that helps,
--Keith
-----------------------------------------------------------
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-dev