hm, in reply to myself
i think a fieldhandler will help me out... cheerz, reinhard -----Ursprüngliche Nachricht----- Von: Reinhard Weiss Gesendet: Di 10.06.2008 17:29 An: [email protected] Betreff: AW: AW: [castor-user] cannot unmarshal my marshalled xml using a mapping file hi werner, well, things are running quite well. currently i am working on the integration of a crm tool via soap based web services using spring-ws and castor as its o/x mapper. by the way, is there a way to declare a 'marshal only' class mapping as well as an 'unmarshal only' class mapping on file basis? so that my class would marshal (only) to <?xml version="1.0" encoding="UTF-8"?> <a:A xmlns:a="http://xyz.com/A"> <a:b> <a:string>one</a:string> <a:string>two</a:string> <a:string>three</a:string> </a:b> </a:A> and could be unmarshalled (only) from <?xml version="1.0" encoding="UTF-8"?> <a:A xmlns:a="http://xyz.com/A"> <!-- here is the difference --> <a:XXX> <a:string>one</a:string> <a:string>two</a:string> <a:string>three</a:string> </a:XXX> </a:A> what i want to do is to define all my mapping files (including two mappings for the same class, one for marshalling and one for unmarshalling) at once and feed spring's castormashaller with them. during marshalling, i simply want to prevent that my class - unpredictable - marshals to the wrong structure (that is the structure i expect as input for unmarshalling). unmarshalling would be safe because it always gets the correct xml. maybe that's labyrinth-thinking. but i could reuse my class even if the xml is (slighlty) different and i didn't have to manage (un-)marshallers for my class instead. cheerz, reinhard! -----Ursprüngliche Nachricht----- Von: Werner Guttmann [mailto:[EMAIL PROTECTED] Gesendet: Mo 09.06.2008 12:28 An: [email protected] Betreff: Re: AW: [castor-user] cannot unmarshal my marshalled xml using a mapping file You are welcome, Reinhard. Werner P.S. How's life these days ? Reinhard Weiss wrote: > > Hi Werner, > > so it seems that i've tried to map the complete list instead of the list > items. > 1000 Thanks - it works perfectly now :) > > cheerz, > reinhard! > > > -----Ursprüngliche Nachricht----- > Von: Werner Guttmann [mailto:[EMAIL PROTECTED] > Gesendet: Mo 09.06.2008 11:16 > An: [email protected] > Betreff: Re: [castor-user] cannot unmarshal my marshalled xml using a mapping > file > > Hi Reinhard, > > have a look at the following mapping that allows me to marshal the given > Java object instances to your desired XML output structure. > > <mapping> > <class name="xml.reinhard.A"> > <description>Mapping for Class com.xyz.A</description> > <map-to xml="A" ns-uri="http://xyz.com/A" ns-prefix="a" /> > <field name="strings" collection="arraylist" type="string"> > <bind-xml name="string" node="element" location="b"/> > </field> > </class> > </mapping> > > Please note that I changed the package when running the test(s) locally. > > Regards > Werner > > Reinhard Weiss wrote: >> hi, >> >> i'am using castor-xml-1.0.5 but even with 1.2 the problem remains: >> i cannot completely unmarshal an object from the xml i have marshalled >> before using a mapping file. >> >> i have a class as simple as this: >> >> >> >> package com.xyz; >> import java.util.List; >> import java.util.ArrayList; >> public class A >> { >> private List<String> strings; >> public A() >> { >> this.strings = new ArrayList<String>(3); >> this.strings.add("one"); >> this.strings.add("two"); >> this.strings.add("three"); >> } >> public void setStrings(List<String> strings) >> { >> this.strings = strings; >> } >> public List<String> getStrings() >> { >> return this.strings; >> } >> } >> >> >> >> the mapping file looks as follows >> >> >> >> <mapping> >> <class name="com.xyz.A"> >> <description>Mapping for Class com.xyz.A</description> >> <map-to xml="A" ns-uri="http://xyz.com/A" ns-prefix="a" /> >> <field name="strings" collection="arraylist" type="string" >> container="false"> >> <bind-xml name="b" node="element"/> >> </field> >> </class> >> </mapping> >> >> >> >> it marshals: >> >> >> >> <?xml version="1.0" encoding="UTF-8"?> >> <a:A xmlns:a="http://xyz.com/A"> >> <!-- notice that there is no namespace anymore ??? --> >> <b> >> <string>one</string> >> <string>two</string> >> <string>three</string> >> </b> >> </a:A> >> >> >> >> ok, the structure of the xml is finally what i want. >> i use the 'container="false"' attribute in the 'field' element to get one >> 'string' element per list item (as suggested on the how-to page). otherwise >> all strings were merged into a single 'string' element containing >> "onetwothree" (however - all elements with correct namespaces). but for some >> reason castor suppresses the namespace when i use the container attribute. >> >> then, if i ignore the namespace issue and try to unmarshal the xml, i don't >> get back my list of strings any more. as castor failed to handle the 'b' >> element throwing a MarshalException ('unable to find FieldDescriptor for >> 'b') first, i have set the 'ignoreExtraElements' property of the >> unmarshaller to 'true' (using a 'location' attribute with 'b/string' in the >> 'bind-xml' element of my mapping instead didn't help as well). >> >> >> >> my test looks as follows >> >> >> public void testMarshalUnmarshal() >> throws Exception >> { >> A a = new A(); >> >> Mapping mapping = new Mapping(); >> mapping.loadMapping("a-mapping.xml"); >> >> StringWriter writer = new StringWriter(); >> >> // global marshaller >> marshaller.setWriter(writer); >> marshaller.setMapping(mapping); >> marshaller.marshal(a); >> >> String marshalled = writer.toString(); >> if (logger.isDebugEnabled) logger.debug(marshalled); >> >> // global unmarshaller >> unmarshaller.setMapping(mapping); >> unmarshaller.setIgnoreExtraAttributes(true); >> unmarshaller.setIgnoreExtraElements(true); >> >> StringReader reader = new StringReader(marshalled); >> >> Object unmarshalled = unmarshaller.unmarshal(reader); >> >> assertNotNull(unmarshalled); >> assertTrue(unmarshalled instanceof A); >> >> // this assertion fails >> assertNotNull(((A) unmarshalled).getStrings()); >> assertEquals(a.getStrings().size(), ((A) >> unmarshalled).getStrings().size()); >> } >> >> >> >> in the end i am still looking for a proper mapping.xml to get the following >> xml: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <a:A xmlns:a="http://xyz.com/A"> >> <a:b> >> <a:string>one</a:string> >> <a:string>two</a:string> >> <a:string>three</a:string> >> </a:b> >> </a:A> >> >> which i can successfully unmarshal again. >> >> any kind of coaching would be nice! >> thx in advance, >> >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> >> DI Reinhard Weiss >> Java Developer >> >> ANECON Software Design und Beratung G.m.b.H. >> Alser Straße 4 / Hof 1 >> A-1090 WIEN >> >> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> >> Zusätzliche Pflichtangaben von Kapitalgesellschaften gem. § 14 UGB: >> FN166941b | Handelsgericht Wien | Firmensitz Wien >> >> >> --------------------------------------------------------------------- >> 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 --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email

