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


Reply via email to