How about providing us with a test case that shows what you are trying to achieve, both in terms of the mapping and the input XML.
Werner > -----Ursprüngliche Nachricht----- > Von: Christopher Spoehr [mailto:[EMAIL PROTECTED] > Gesendet: Donnerstag, 26. April 2007 16:24 > An: [email protected] > Betreff: Re: [castor-user] [XML] Marshalling Nested Hashmaps > > Thank you, Werner. I had looked at the how-to's. The XML CTF test suite > provided some great guidance. I've got a 2 level HashMap working > satisfactorily. > > From these explorations, it looks like my ultimate goal of being able to > marshal a HashMap of HashMaps, Arrays and Vectors might be out of reach. > From the <field> DTD it looks like any given field can only be a be 1 type > of hard-coded collection. Is this true? > > Alternatively, will Castor try to match to the best field it can - > allowing for repeat 'value' fields within the same <class> that have > different collection attributes? > > I'm continuing to poke around the XML CTF test suite for evidence of this > and haven't seen anything so far. > > Thanks. > -Chris > > > -------Original Message------- > > From: Werner Guttmann <[EMAIL PROTECTED]> > > Subject: Re: [castor-user] [XML] Marshalling Nested Hashmaps > > Sent: Apr 25 '07 20:03 > > > > Christopher, > > > > can I take it you have had a look at > > > > http://www.castor.org/how-to-map-a-hashtable.html > > > > to get an idea about nested hashmaps/collections in general. If that > > does not help, you'll find working code in the XML CTF test suite, more > > particularly at > > > > > http://svn.castor.codehaus.org/browse/castor/castor/trunk/xmlctf/tests/Mas > terTestSuite/mapping/collections/Maps > > > > I hope this helps > > > > Werner > > > > > > Christopher Spoehr wrote: > > > Hello- > > > > > > I'm trying to marshal/unmarshal a HashMap of HashMaps (eventually it > will be a HashMap of HMs, Vectors, and Arrays, but one step at a time.) > The XML I'll eventually be working with will be given to me as one string > - that's why I'm working with the string readers/writers. > > > > > > Using the Castor FAQ and the archives, I've gotten Castor to marshal > and unmarshal the bean class holding the HM successfully for a single > dimensional HashMap. For the nested HM, Castor marshals acceptably but > gets hung up on the unmarshaling. Any tips would be appreciated. I'd seen > in a previous thread that Stephen Bash has had some experience with this. > Are you still out the Stephen? > > > > > > Holder Class: > > > > > > public class HashMapHolderBean { > > > > > > private HashMap heldHashMap; > > > > > > public HashMapHolderBean() > > > { > > > heldHashMap = new HashMap(); > > > } > > > > > > public HashMapHolderBean(HashMap inputHashMap) > > > { > > > heldHashMap = inputHashMap; > > > } > > > > > > public HashMap getHeldHashMap() { > > > return heldHashMap; > > > } > > > > > > public void setHeldHashMap(HashMap map) { > > > heldHashMap = map; > > > } > > > } > > > > > > HashMapHolderBeanMapping.xml: > > > <?xml version="1.0" encoding="UTF-8"?> > > > <mapping> > > > <class name="com.sbc.cctp.easl.web.artt.HashMapHolderBean" auto- > complete="false"> > > > <description>Default mapping for class > com.sbc.cctp.easl.web.artt.HashMapHolderBean</description> > > > <map-to xml="hash-map-holder-bean" /> > > > <field name="heldHashMap" collection="map"> > > > <bind-xml name="held-hash-map"> > > > <class > > name="org.exolab.castor.mapping.MapItem"> > > > <field name="key" type="string"> > > > <bind-xml name="key" > > node="element" > /> > > > </field> > > > <field name="value" > type="java.lang.Object"> > > > <bind-xml name="value" > node="element"> > > > <class > name="org.exolab.castor.mapping.MapItem" /> > > > </bind-xml> > > > </field> > > > </class> > > > </bind-xml> > > > </field> > > > </class> > > > </mapping> > > > > > > Marshalling/Unmarshalling code: > > > private String testMarshalling() > > > { > > > HashMap mapHM = new HashMap(); > > > mapHM.put("test","Hello World."); > > > mapHM.put("test2","Hello Universe"); > > > > > > HashMap level2 = new HashMap(); > > > level2.put("level2_1","I'm level two"); > > > > > > mapHM.put("level2", level2); > > > > > > HashMapHolderBean hashMapHolder = new > HashMapHolderBean(mapHM); > > > StringWriter stringWriter = new StringWriter(); > > > > > > try > > > { > > > > > > //InputSource mappingSource = new InputSource( new > StringReader(generateMapString())); > > > InputSource mappingSource = new > InputSource(ClassLoader.getSystemResource("HashMapHolderBeanMapping.xml"). > toString()); > > > Mapping mapping = new > Mapping(AutomatedRegressionTestTool.class.getClassLoader()); > > > mapping.loadMapping(mappingSource); > > > > > > Marshaller marshaller = new Marshaller(stringWriter); > > > marshaller.setMapping(mapping); > > > marshaller.marshal(hashMapHolder); > > > } > > > catch (Exception e) > > > { > > > log.error("Marshalling Error",e); > > > } > > > > > > return stringWriter.getBuffer().toString(); > > > } > > > > > > private HashMapHolderBean testUnMarshalling(String marshalled) > > > { > > > String sourceString = marshalled; > > > log.info("Marshalled length: " + marshalled.length()); > > > log.info("Source length: " + sourceString.length()); > > > log.info(sourceString); > > > > > > HashMapHolderBean hmhb = new HashMapHolderBean(); > > > > > > try > > > { > > > InputSource mappingSource = new > InputSource(ClassLoader.getSystemResource("HashMapHolderBeanMapping.xml"). > toString()); > > > Mapping mapping = new > Mapping(AutomatedRegressionTestTool.class.getClassLoader()); > > > mapping.loadMapping(mappingSource); > > > > > > Unmarshaller unm = new Unmarshaller(mapping); > > > > > > hmhb = (HashMapHolderBean)unm.unmarshal(new > StringReader(sourceString)); > > > } > > > catch (IOException ioException) > > > { > > > log.error("IOException occured in testUnMarshalling() > ", ioException); > > > } > > > catch (MappingException mappingException) > > > { > > > log.error("Mapping exception occured in > testUnMarshalling() ", mappingException); > > > } > > > catch (Exception e) > > > { > > > log.error("Unmarshalling exception caught.", e); > > > } > > > > > > return hmhb; > > > > > > } > > > > > > toString of the HM returned by testUnMarshalling (from inside of the > holder bean, of course): > > > {test2=Hello Universe, > [EMAIL PROTECTED], test=Hello World.} > > > > > > Of course I'll be happy to answer any clarification questions one may > need to ask. > > > > > > Chris Spoehr > > > > > > --------------------------------------------------------------------- > > > 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

