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


Reply via email to