Hey Zachariah,

there is nothing wrong with the way you are using Castor. The problem in your 
case is that the XML specification states the following:

"There is exactly one element, called the root, or document element, no part of 
which appears in the content of any other element." [1]

This contract is violated by your (generated) XML instance.

The reason why Castor can deal with your Collection and produce valid XML 
output is simply because Castor uses a lot of introspection. It is more 
complicated the other way round, because the Unmarshaller on the one hand has 
no idea how to handle a non well formed XML instance and on the other hand does 
not know what type the client code is expecting as there don't exist any 
generic methods in the Castor XML API.

So, back to your problem:

Introduce a parent element and embed your Collection.

<mapping>
    <class name="Farm" type="com.zandroid.model.Farm">
        <field name="pets" type=""com.zandroid.model.Pet" 
collection="arraylist"> 
            <bind-xml name="pet"/>
        </field>
...

Your Farm domain object simply holds a List of Pet elements. Remember to add 
accessors (getX/setX)!

If you need further information, please consider the reference guide[2].

Regards,
Lukas

[1] http://www.w3.org/TR/xml/#dt-root
[2] http://castor.codehaus.org/reference/html-single/index.html


Am 18.02.2010 um 05:09 schrieb Zachariah Young:

> I'm trying to work through a simple use case for Castor and I'm getting the 
> following error.  What I'm trying to do is read in an XML file with a list of 
> objects.
> 
> Exception in thread "main" org.exolab.castor.xml.MarshalException: The class 
> for the root element 'array-list' could not be found.{File: [not available]; 
> line: 2; column: 13}
> 
> My simple entity looks like the following.
> 
> public class Pet implements Serializable  {
> 
>     private String Name;
>     private String Type;
> 
>     public void setName(String name) {
>         Name = name;
>     }
> 
>     public String getName() {
>         return Name;
>     }
> 
>     public void setType(String type) {
>         this.Type = type;
>     }
> 
>     public String getType() {
>         return Type;
>     }
> }
> My mapping file looks like this.
> 
> <mapping>
> <class name="com.zandroid.model.Pet" auto-complete="true">         
>    <map-to xml="pet"/>
>    <field name="name" type="string">
>       <bind-xml name="name" node="element"/>
>    </field>
>    <field name="type" type="string">
>       <bind-xml name="type" node="element"/>
>    </field>
> </class>
> </mapping>
> 
> In my main class I have the follow code.
> 
>     public static void main(String[] args) throws IOException, 
> MappingException, MarshalException, ValidationException {
> 
>         List<Pet> arrayList = new ArrayList<Pet>();
>         Pet pet = new Pet();
>         pet.setName("Zoe");
>         pet.setType("Dog");        
>         arrayList.add(pet);
>     
>         Pet pet1 = new Pet();
>         pet1.setName("Gary");
>         pet1.setType("Cat");
>         arrayList.add(pet1);
>         
>         Writer fileWriter = new FileWriter("text.xml");        
>         
>         Mapping mapping = new Mapping();
>         mapping.loadMapping("mapping.xml");
> 
>         XMLContext context = new XMLContext();
>         context.addMapping(mapping);
>         
>         Marshaller marshaller = context.createMarshaller();
>         marshaller.setWriter(fileWriter);
> 
>         marshaller.marshal(arrayList);
>         
>         context.createUnmarshaller().setClass(ArrayList.class);
>         
>         FileReader reader = new FileReader("text.xml");
> 
>         ArrayList<Pet> pets = 
> (ArrayList<Pet>)context.createUnmarshaller().unmarshal(reader);
>         
>         for (Pet pet2 : pets) {
>             System.out.println(pet2.getName());
>         }     
>     }
> 
> This code creates the following xml file.
> <array-list>
> <pet><name>Zoe</name><type>Dog</type></pet>
> <pet><name>Gary</name><type>Cat</type></pet>
> </array-list>
> 
> So when I go Unmarshaller the XML file I get the The class for the root 
> element 'array-list'. 
> 
> 1.  Should I be doing something different in my mapping file?
> 2.  Should I create another class that has a property of List<Pet>?
> 3.  Is this the correct use case for Castor?
> 
> Note:  I'm also trying to get this to work in Spring 3.  Also I have review 
> this article http://www.castor.org/how-to-map-a-list-at-root.html
> 
> Thanks for the help.
> -- 
> Zachariah Young
> http://zachariahyoung.com
> 


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

    http://xircles.codehaus.org/manage_email


Reply via email to