Hi Reinhard,
just in case you missed my other email about altering your mapping file,
here's the mapping file I have used to marshall an instance of A
according to your desired output.
<?xml version="1.0" ?>
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
"http://castor.org/mapping.dtd">
<mapping xmlns:r="http://xyz.com">
<!-- this mapping has not yet been pimped to qualify attributes -->
<class name="xml.reinhard2.A">
<map-to xml="OBJECT" ns-uri="http://xyz.com" ns-prefix="p" />
<field name="name" type="string">
<bind-xml name="r:objectName" node="attribute" />
</field>
<field name="strings" collection="map" type="xml.reinhard2.B"
set-method="addString"
get-method="getStrings">
<bind-xml name="STRING" node="element" />
</field>
</class>
<class name="org.exolab.castor.mapping.MapItem">
<field name="key" type="string" transient="true" />
<field name="value" type="xml.reinhard2.B" container="true" />
</class>
<class name="xml.reinhard2.B">
<map-to ns-uri="http://xyz.com" ns-prefix="p" />
<field name="name" type="string">
<bind-xml name="r:name" node="attribute" />
</field>
<field name="value" type="other">
<bind-xml node="text" />
</field>
</class>
</mapping>
Regards
Werner
Reinhard Weiss wrote:
>
> hi werner,
>
> thanks again for your quick reply, and sorry for not sending an example - i
> was quite sure there was a simple way of configuration using a mapping file,
> which i have overseen.
>
> to your questions:
>
> -why not generate code from xsd?
>
> i am working with wsdl, which contains more than one schema section. elements
> defined there are crosslinked via (target)namespaces. honestly, i am not very
> pleased about extracting these schemas to generate code for each. i prefer
> the 'manual way' of mapping my objects. i have hoped this way would be more
> robust to changes as well.
>
> -is there an example?
>
> abstracting the real situation is a little bit tricky, but here we go:
>
>
>
> public class A {
> private String name;
> private Map<String, B<String>> strings = new HashMap<String, B<String>>(3);
>
> public void setName(String name) {
> this.name = name;
> }
> public String getName() {
> return this.name;
> }
>
> public void addString(B<String> s) {
> this.strings.put(s.getName(), s);
> }
> public Map<String, B<String>> getStrings() {
> return this.strings;
> }
> }
>
>
>
> public B <T> {
> private T value;
> private String name;
>
> public void setValue(T value) {
> this.value = value;
> }
> public T getValue() {
> return this.value;
> }
>
> public void setName(String name) {
> this.name = name;
> }
> public String getName() {
> return this.name;
> }
> }
>
>
>
> <mapping>
> <!-- this mapping has not yet been pimped to qualify attributes -->
> <class name="com.xyz.A">
> <map-to xml="OBJECT"
> ns-uri="http://xyz.com"
> ns-prefix="p"/>
> <field name="name" type="string">
> <bind-xml name="objectName" node="attribute"/>
> </field>
> <field name="strings"
> collection="map" type="com.xyz.B"
> set-method="addString" get-method="getStrings">
> <bind-xml name="STRING" node="element"/>
> </field>
> </class>
>
> <class name="org.exolab.castor.mapping.MapItem">
> <field name="key" type="string" transient="true"/>
> <field name="value" type="com.xyz.B" container="true"/>
> </class>
>
> <class name="com.xyz.B">
> <map-to ns-uri="http://xyz.com"
> ns-prefix="p"/>
> <field name="name" type="string">
> <bind-xml node="attribute"/>
> </field>
> <field name="value" type="other">
> <bind-xml node="text"/>
> </field>
> </class>
>
> </mapping>
>
>
>
> the test
>
> public void testMarshalUnmarshal() {
> B<String> wordsOfWisdom = new B<String>();
> wordsOfWisdom.setValue("Hello World");
> wordsOfWisdom.setName("wordsOfWisdom");
> A myObject = new A();
> myObject.setName("myObject");
> myObject.addString(wordsOfWisdom);
>
> Mapping mapping = new Mapping();
> mapping.loadMapping("<location-of-mapping-file>");
>
> StringWriter writer = new StringWriter();
>
> marshaller.setWriter(writer);
> marshaller.setMapping(mapping);
> marshaller.marshal(myObject);
>
> String actual = writer.toString();
> if (logger.isDebugEnabled()) logger.debug(actual);
>
> Reader reader = new StringReader(actual);
>
> unmarshaller.setMapping(mapping);
> Object o = unmarshaller.unmarshal(reader);
>
> assertTrue(o instanceof A);
> assertEquals(myObject.getName(), ((A) o).getName());
> assertNotNull(((A) o).getStrings());
> assertEquals(1, ((A) o).getStrings().size());
> B<String> _wordsOfWisdom = ((A)
> o).getStrings().get(wordsOfWisdom.getName());
> assertNotNull(_wordsOfWisdom);
> assertEquals(wordsOfWisdom.getName(), _wordsOfWisdom.getName());
> assertEquals(wordsOfWisdom.getValue(), _wordsOfWisdom.getValue());
> }
>
>
>
> actual marshalled example output:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <p:OBJECT xmlns:p="http://xyz.com" objectName="myObject">
> <p:STRING name="wordsOfWisdom">Hello World</p:STRING>
> </p:OBJECT>
>
> desired output
>
> <?xml version="1.0" encoding="UTF-8"?>
> <!-- attributes should be qualified -->
> <p:OBJECT xmlns:p="http://xyz.com" p:objectName="myObject">
> <p:STRING p:name="wordsOfWisdom">Hello World</p:STRING>
> </p:OBJECT>
>
>
>
> following your suggestion, i added an 'xmlns:p="http://xyz.com"' attribute on
> each <class> element level (which is not valid according to DTD) and fixed
> the <bind-xml> 'name' attribute. when i run my test (which is succesful with
> unqualified attributes) it fails with an SAXException complaining
>
> "unable to find FieldDescriptor for 'STRING' in ClassDescriptor of OBJECT{...}
> at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:732)
> at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:588)"
>
>
>
> hmm, i am not sure what to do next. do you have any suggestions once more?
>
>
> thx, reinhard!
>
>
> -----Ursprüngliche Nachricht-----
> Von: Werner Guttmann [mailto:[EMAIL PROTECTED]
> Gesendet: Mo 16.06.2008 20:22
> An: [email protected]
> Betreff: Re: [castor-user] how to qualify marshalled attributes?
>
> Actually, have a look at the following mapping for a very simple Entity
> class:
>
> <?xml version="1.0" ?>
> <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
> "http://castor.org/mapping.dtd">
> <mapping>
>
> <class name="xml.reinhard.Entity" xmlns:r="http://test">
> <map-to xml="entity" ns-prefix="r" ns-uri="http://test"/>
> <field name="id" type="integer" >
> <bind-xml name="id" />
> </field>
> <field name="name" type="string">
> <bind-xml name="name" />
> </field>
> <field name="att" type="string">
> <bind-xml name="r:att" node="attribute" />
> </field>
> </class>
>
> </mapping>
>
> This works out of the box. Please *note* that removing the xmlns:r
> namespace declaration will cause a failure when unmarshalling the
> mapping file.
>
> I hope this helps.
>
> Werner
>
> Werner Guttmann wrote:
>> Reinhard,
>>
>> please read inline.
>>
>> Reinhard Weiss wrote:
>>> hi,
>>>
>>> is there a way to force qualification of attributes in the marshalled
>>> xml output (e.g. in case the schema defines
>>> attributeFormDefault="qualified")?
>> If you happen to have an XML schema at hands (and you last comment seems
>> to indicate this), why don't you generate domain classes and descriptor
>> classes from the XML schema, and things will be taken care of
>> automatically ?
>>
>>> qualification of elements can easily be done via the <map-to>
>>> element. but i have not found a way to define namespaces for
>>> attributes.
>> Can I assume that you are using a mapping file ?
>>> eg using the 'QName-prefix' in the <bind-xml> does not
>>> seem to have much effect.
>> Have you tried to use a <bind-xml> element such as
>>
>> <bind-xml name="a:attribute" />
>>
>> I know this might not feel right, but let's try to narrow this down
>> first ? If you had a *minimal * test case, please feel free to make it
>> available ? The less time I spend on setting things up, the more I cam
>> e.g. debug source code to see what's going wrong (in case this is a bug)
>> or what's missing configuration-wise.
>>
>>> thx,
>>>
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>>
>>> DI Reinhard Weiss Java Developer
>>>
>>> ANECON Software Design und Beratung G.m.b.H. Alser Straße 4 / Hof 1
>>> A-1090 WIEN
>>>
>>> Tel.: +43 1 409 58 90-0 Fax: +43 1 409 58 90-998 Web:
>>> http://www.anecon.com
>>>
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>>
>>> 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