Thank you for the clarification.

I am at the point where I want to marshall multiple objects into one XML
file.  The root element must be unique, so is there a way to do this with
castor?

I have found the following two posts helpful:
1. https://docs.codehaus.org/display/CASTOR/MultipleObjectsTo1XML
"To marshall multiple objects into a single document, you can do the
following:

marshaller m = new Marshaller(...);
m.setMarshalAsDocument(false);

and then pass in multiple objects:

m.marshal(obj1);
m.marshal(obj2);

and so on.."


and:


2. http://osdir.com/ml/java.castor.devel/2003-08/msg00321.html

Keith Visco wrote:
> 
> Maryanne,
> 
> The "obvious" answer is probably your best bet, but you can also do the
> following:
> 
> PrintWriter pw = new PrintWriter(writer, true);
> pw.println("<?xml version=\"1.0\"?>");
> pw.println("<myroot>");
> 
> Marshaller m = new Marshaller(pw);
> m.setMarshalAsDocument(false);
> m.marshal(obj1);
> m.marshal(obj2);
> pw.println("</myroot>");
> 
> --Keith
> 


Following the example on IBM's site closely, I now have:
package ibm.xml.castor;

import java.io.*;
import org.exolab.castor.xml.Marshaller;

public class MarshalTester {

    public static void main(String[] args) {
        try {
            BufferedWriter theBufferedFileWriter = new BufferedWriter(new
FileWriter("cds.xml"));
            StringWriter theStringWriter = new StringWriter();

            //1st CD object
            CD cd1 = new CD("CD 1", "Artist 1");
            cd1.addTrack("Track 1");
            cd1.addTrack("Track 2");

            //Marshall to our StringWriter 
            //Default is setMarshalAsDocument == true to set header
            Marshaller m = new Marshaller();
            m.setWriter(theStringWriter);
            m.marshal(cd1);

            //Prepare marshaller for appending more objects
            m.setMarshalAsDocument(false);
            
            //2nd CD object
            CD cd2 = new CD("myCd", "myArtist");
            cd2.addTrack("traack 1");
            cd2.addTrack("traack 2");

            //Marshall 2nd CD to our StringWriter
            m.marshal(cd2);

            //Write StringWriter buffer to file
            theBufferedFileWriter.write(theStringWriter.toString());

            theBufferedFileWriter.close();
            theStringWriter.close();
        } catch (Exception e) {
            System.err.println(e.getMessage());
            e.printStackTrace(System.err);
        }
    }
}
CD class is Listing 2 on:
http://www.ibm.com/developerworks/xml/library/x-xjavacastor1/

So my concern is, if I simply set setMarshalAsDocument = false from the
beginning and set the header and root element manually, wouldn't that give
an error during unmarshalling because I'd need to change my class and
mapping to reflect the new root element?  I can perhaps see why this isn't
implemented in castor; it would require the class to be changed upon
unmarshalling... and to what type of sequence?

So I guess the only way is to specify another class that holds a sequence of
my base CD class and then marshall that.  For big files, this might become a
memory problem though.  Any suggestions on if I can avoid this problem?
-- 
View this message in context: 
http://www.nabble.com/Marshalling-to-XML-conforming-to-existing-XSD-tp18611513p18654305.html
Sent from the Castor - User mailing list archive at Nabble.com.


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

    http://xircles.codehaus.org/manage_email


Reply via email to