Please, send me schema you modified and class you are generated Seems that I send you wrong version of xsd. Here is what I'm using. Only different is ref <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/foo" xmlns:tns="http://example.com/foo" elementFormDefault="qualified"> <complexType name="fooType"> <sequence> <element name="children" minOccurs="0" nillable="false"> <complexType> <sequence> <element ref="tns:foo" maxOccurs="unbounded"> </element> </sequence> </complexType> </element> </sequence> <attribute name="name"></attribute> </complexType> <element name="foo" type="tns:fooType"></element> </schema>
Terv. Antoni -----Original Message----- From: Werner Guttmann [mailto:[EMAIL PROTECTED] Sent: 10. huhtikuuta 2008 12:45 To: [email protected] Subject: Re: [castor-user] How to use hierarchical objects with wrapper Just to let you know, after modifying your XML schema slightly, I was able to pruduce the desired output as follows just by generating classes from the XML schema given, without having to write a mapping file. Regards Werner Committer, Castor Alatalo, Antoni wrote: > Hi, > Here is all in nutshell: > SCHEMA: > <?xml version="1.0" encoding="UTF-8"?> <schema > xmlns="http://www.w3.org/2001/XMLSchema" > targetNamespace="http://example.com/foo" > xmlns:tns="http://example.com/foo" elementFormDefault="qualified"> > <complexType name="fooType"> > <sequence> > <element name="children" minOccurs="0"> > <complexType> > <sequence> > <element name="child" > type="tns:fooType" > maxOccurs="unbounded"> > </element> > </sequence> > </complexType> > </element> > </sequence> > <attribute name="name"></attribute> > </complexType> > <element name="foo" type="tns:fooType"></element> </schema> > > CASTOR > <?xml version="1.0"?> > <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" > "http://castor.org/mapping.dtd"> <mapping> > <class name="com.example.Foo" auto-complete="false"> > <map-to xml="foo" ns-uri="http://example.com/foo" > ns-prefix="foo" /> > <field name="name" type="java.lang.String"> > <bind-xml name="name" node="attribute" /> > </field> > <field name="children" collection="collection" > type="com.example.Foo" container="false"> > </field> > </class> > </mapping> > > BEAN > package com.example; > import java.util.Collection; > > public class Foo { > private String name; > private Collection<Foo> children; > > public Foo(){} > public Foo(String name){ > setName(name); > } > public Collection<Foo> getChildren() { > return children; > } > public void setChildren(Collection<Foo> children) { > this.children = children; > } > public String getName() { > return name; > } > public void setName(String name) { > this.name = name; > } > } > > > TESTCASE: > package com.example; > > import java.io.IOException; > import java.io.StringReader; > import java.io.StringWriter; > import java.util.Collection; > import java.util.HashSet; > > import junit.framework.TestCase; > import org.exolab.castor.xml.XMLContext; import > org.exolab.castor.mapping.Mapping; > import org.exolab.castor.mapping.MappingException; > import org.exolab.castor.xml.MarshalException; > import org.exolab.castor.xml.Unmarshaller; > import org.exolab.castor.xml.Marshaller; import > org.exolab.castor.xml.ValidationException; > > import com.example.Foo; > > public class CastorFooTest extends TestCase { > Mapping mapping = null; > XMLContext context = null; > public void setUp() throws IOException, MappingException{ > mapping = new Mapping(); > mapping.loadMapping("src/META-INF/castor/foo-castor.xml"); > context = new XMLContext(); > context.addMapping(mapping); > } > public void testMarhallFoo() throws IOException, MappingException, > MarshalException, ValidationException{ > Marshaller marshaller = context.createMarshaller(); > StringWriter writer = new StringWriter(); > marshaller.setWriter(writer); > marshaller.setMarshalAsDocument(false); > marshaller.setMapping(mapping); > marshaller.setSuppressNamespaces(false); > marshaller.marshal(getFoo()); > assertEquals(expected, writer.getBuffer().toString()); > } > public void testUnMarhallFoo() throws IOException, MappingException, > MarshalException, ValidationException{ > Unmarshaller unmarshaller = context.createUnmarshaller(); > StringReader reader = new StringReader(expected); > Foo result = (Foo)unmarshaller.unmarshal(reader); > Foo exp = getFoo(); > assertEquals(exp.getName(), result.getName()); > } > private Foo getFoo(){ > Foo foo = getFoo(""); > Collection<Foo> children = new HashSet<Foo>(); > children.add(getFoo("2")); > children.add(getFoo("1")); > foo.setChildren(children); > return foo; > } > private Foo getFoo(String s){ > Foo foo = new Foo("foo".concat(s)); > return foo; > } > private String expected = "<foo:foo > xmlns:foo=\"http://example.com/foo\" > name=\"foo\"><foo:children><foo:foo name=\"foo1\"></foo:foo><foo:foo > name=\"foo2\"></foo:foo></foo:children></foo:foo>"; > } > > > Expected output > <?xml version="1.0" encoding="UTF-8"?> <foo:foo name="foo" > xmlns:foo="http://example.com/foo"> > <foo:children> > <foo:foo name="foo1"/> > <foo:foo name="foo2"/> > </foo:children> > </foo:foo> > > OUTPUT I GET: > <?xml version="1.0" encoding="UTF-8"?> <foo:foo name="foo" > xmlns:foo="http://example.com/foo"> > <children> - ERROR NUMBER 1 > <foo:foo name="foo1"> > <children /> - ERROR NUMBER 2 > </foo:foo> > <foo:foo name="foo2"> > <children /> - ERROR NUMBER 2 > </foo:foo> > </children> - ERROR NUMBER 1 > </foo:foo> > > Output I get isn't valid: > 1. <children> element must have foo prefix as all others: > <foo:children> 2. there must not be empty <children/> element at all > > Regards. > Antoni > > -----Original Message----- > From: Werner Guttmann [mailto:[EMAIL PROTECTED] > Sent: 9. huhtikuuta 2008 15:13 > To: [email protected] > Subject: Re: [castor-user] How to use hierarchical objects with > wrapper > > > > Alatalo, Antoni wrote: >> Hi, >> I have Object A that has Collection of Objects A. Normal hierarchy >> structure. >> I got to work it almost well except two details. >> The collection is wrapped. It should look like this Lets name >> namespace like bar <bar:foo name="1"> >> <bar:children> >> <bar:foo name="2*"*/> >> <bar:foo name="3"/> >> </bar:children> >> </bar:foo> >> >> The problem is that chioldren while marhalling doen't get bar prefix. >> This is output after marshalling >> <bar:foo name="1"> >> <children> >> <bar:foo name="2*"*> >> <children/> >> </bar:foo> >> <bar:foo name="3"> >> <children/> >> </bar:foo> >> </children> >> </bar:foo> >> >> How can i configure mapper to use prefix with "children" wrapper? >> Without this xml is not valid! > What version of Castor are you using ? And what does your mapping for the > relevant classes look like ? It looks like you are using the locations > attribute on the field mapping for the 'bar' children ? > >> Teh next thing is empty collection. How can i configure mapper to >> exclude empty or null not required values? > Can you show us some sample XML that highlights your problem ? It just isn't > fully clear to me what the problem is. > >> Thank you >> *Antoni Alatalo >> *Ohjelmistoasiantuntija >> Kuntatoimiala, sosiaalitoimi >> _________________________________________ >> >> *Logica **- Releasing your potential >> >> *Karvaamokuja 2 >> PL 38 >> 00381 Helsinki >> Vaihde: 010 302 010 >> Suora: 040 583 1097 >> [EMAIL PROTECTED] >> _www.logica.fi_ <http://www.logicacmg.fi> WM-datan nimi on nyt >> *Logica.* >> >> > > > --------------------------------------------------------------------- > 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

