I think your problem is here:  

  <mapping type-name="Container" abstract="true"
                class="org.standard.Container">
    <structure name="Header" field="header" map-as="Header" usage="optional"/>
    ...
  </mapping>

  <mapping name="Container"
                class="org.standard.Container">
    <structure map-as="Container"/>
  </mapping>

You're telling Jibx that Container includes a Container element as it's
first element.  In general, you don't have to "double-declare" elements
this way unless you're extending from something that can appear as a
standalone element (such as your "Header" example).

I took this out and made a few other minor changes to your binding and,
assuming that I understand your class structure and XML structure
correctly, was able to produce a binding file that works correctly:

<binding direction="input">
  <namespace uri="http://www.gmail.com/st"; prefix="st" 
      default="elements" />
  <namespace uri="http://www.gmail.com/my"; prefix="my" />

  <mapping class="org.standard.SuperHeader" abstract="true" 
           ns="http://www.gmail.com/st";>
    <value name="companyId" field="companyId" />
  </mapping>

  <mapping class="org.standard.Header" ns="http://www.gmail.com/st"; 
           type-name="header" abstract="true"> 
    <structure map-as="org.standard.SuperHeader" />
    <value name="branchId" field="branchId" />
  </mapping>  

  <mapping name="Header" class="org.standard.Header" 
           extends="org.standard.SuperHeader" 
           ns="http://www.gmail.com/st";>    
    <structure map-as="header" />
  </mapping>  

  <mapping name="myHeader" class="com.my.Header" 
           extends="org.standard.Header" ns="http://www.gmail.com/my";>
    <structure map-as="header" />
    <value name="employeeId" field="employeeId" 
           ns="http://www.gmail.com/my"; />
  </mapping>

  <mapping name="Container" class="org.standard.Container" 
           ns="http://www.gmail.com/st";>
    <structure field="header" />
  </mapping>
</binding>

I added some random data elements to each of the classes so that I could
verify that the bindings were being processed correctly.

I tested this against the following two XML documents:

<st:Container xmlns:st="http://www.gmail.com/st";>
  <my:myHeader xmlns:my="http://www.gmail.com/my";>
    <st:companyId>123</st:companyId>
    <st:branchId>456</st:branchId>
    <my:employeeId>abc</my:employeeId>
  </my:myHeader>
</st:Container>

and:

<st:Container xmlns:st="http://www.gmail.com/st";>
  <st:Header>
    <st:companyId>123</st:companyId>
    <st:branchId>456</st:branchId>
  </st:Header>
</st:Container>

Which I beleive encompass your primary use cases (again, data elements
made up so I could verify that everything unmarshalled correctly).

I take it from your description below that myHeader extends Header,
which extends SuperHeader (and Container extends nothing, but has a data
element of type SuperHeader).  If I'm off about the actual type
hierarchy, things change around a bit, but not much.

On Wed, 2008-01-23 at 17:52 -0500, amphoras wrote:
> Hi,
> 
> First, I want to say that JiBX is a really neat tool.  It makes XML to
> Java serialization so easy.  However, we are using schema group
> substitution a lot, and this seems to be an "advanced" feature.  I
> would really appreciate your help.
> 
> I have read the page about mapping inheritance
> (http://jibx.sourceforge.net/tutorial/binding-mappings.html#inherit)
> many times, but I am still not able to get it to work.  What I have is
> this class hierarchy:
> 
> org.standard.SuperHeader
> org.standard.Header
> com.my.Header
> 
> The schema for my Header says (st=standard):
> <xsd:element name="Header" type="HeaderType" substitutionGroup="st:Header" />
> 
> The JiBX mapping is defined as follows:
>   <mapping type-name="Header" abstract="true"
>               class="org.standard.Header"
>       extends="org.standard.SuperHeader">
>     <structure map-as="SuperHeader"/>
>     ...
>   </mapping>
> 
>   <mapping name="Header"
>               class="org.standard.Header"
>       extends="org.standard.SuperHeader">
>     <structure map-as="Header"/>
>   </mapping>
> 
> 
> subclass:
>   <mapping name="myHeader"
>               class="com.my.Header"
>       extends="org.standard.Header">
>     <structure map-as="Header"/>
>     ...
>   </mapping>
> 
> Then I have a container class, let's call "org.standard.Container"
> that can contain either "org.standard.Header" or "com.my.Header":
> 
>   <mapping type-name="Container" abstract="true"
>               class="org.standard.Container">
>     <structure name="Header" field="header" map-as="Header" usage="optional"/>
>     ...
>   </mapping>
> 
>   <mapping name="Container"
>               class="org.standard.Container">
>     <structure map-as="Container"/>
>   </mapping>
> 
> The Java class is like:
> 
> package org.standard;
> 
> public class Container {
>     Header header;
> }
> 
> When I process XML that contains <st:Header>, everything's fine.  But
> when I process XML that contains <my:Header>, it doesn't work:
> 
> Here's the XML:
> <st:Container>
>     <my:Header>
>     ...
>     </my:Header>
> </st:Container>
> 
> I get:
> 
> org.jibx.runtime.JiBXException: Expected "{http://standard}Container";
> end tag, found "{http://my}Header"; start tag (line 67, col 35)
>       at 
> org.jibx.runtime.impl.UnmarshallingContext.parsePastCurrentEndTag(Unknown
> Source)
> 
> I have tried all different combinations of "map-as" to no avail.  I
> really like the natural, OO way that JiBX does schema group
> substitution, so I really want to get this to work.  I appreciate any
> help that you can give me.
> 
> Thanks!
> --Polly
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> jibx-users mailing list
> jibx-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/jibx-users

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
jibx-users mailing list
jibx-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jibx-users

Reply via email to