You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@xmlbeans.apache.org by Andy Putnins <pu...@lett.com> on 2008/12/03 11:27:52 UTC

How to decode concrete type from abstract element?

I am using XMLbeans to bind Java objects to NETCONF (RFC 4741) RPC messages.
The schema fragment below shows an abstract element, rpcOperation, of type
rpcOperationType as the head of a substitution group.

Using substitute(QName, SchemaType), I can easily create concrete instances of 
the abstract element because I know the concrete type a priori, but I can't figure 
out how go in the opposite direction, i.e. extract the concrete type from the abstract 
element.

Schema fragment:
    <!--
        <rpc> element
    -->
    <xs:complexType name="rpcType">
        <xs:sequence>
            <xs:element ref="rpcOperation" />
        </xs:sequence>
        <xs:attribute name="message-id" type="messageIdType" use="required" />
        <!-- Arbitrary attributes can be supplied with <rpc> element. -->
        <xs:anyAttribute processContents="lax" />
    </xs:complexType>

    <!--
        rpcOperationType: used as a base type for all NETCONF operations
    -->
    <xs:complexType name="rpcOperationType" />

    <xs:element name="rpcOperation" type="rpcOperationType" abstract="true" />

and a number of rpcOperationType substitution types and corresponding elements, e.g.

    <xs:complexType name="xyzType">
        <xs:complexContent>
            <xs:extension base="rpcOperationType">
                <xs:sequence>
                    {various protocol elements}
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="xyz" type="xyzType" substitutionGroup="rpcOperation" />

When decoding a RPC message, how can I instantiate the concrete element (e.g. xyz of type xyzType) from 
the abstract rpcOperation element?

If I extract the abstract element using the only provided getter (RpcDocument.getRpcOperation()),
I get an xml-fragment that has the actual type buried in it, but no obvious way to recast it.

RpcDocument doc = RpcDocument.getRpc() contains:
<xml-fragment message-id="1">
  <urn:get xmlns:urn="urn:ietf:params:xml:ns:netconf:base:1.0"/>
</xml-fragment>

but RpcOperationType op = doc.getRpcOperation() contains:
<xml-fragment xmlns:urn="urn:ietf:params:xml:ns:netconf:base:1.0"/>

Looking at the above "op" fragment with a debugger shows that the object is of type GetTypeImpl, 
and there is other information in the object that identifies it's type, but I don't see any
method to extract this.

The generated methods are:

Interface xmlbeans.RpcDocument
Method Summary
 RpcType    addNewRpc()         Appends and returns a new empty "rpc" element
 RpcType    getRpc()            Gets the "rpc" element
 void       setRpc(RpcType rpc) Sets the "rpc" element

Interface xmlbeans.RpcType
Method Summary
 RpcOperationType    addNewRpcOperation()                           Appends and returns a new empty "rpcOperation" element
 java.lang.String    getMessageId()                                 Gets the "message-id" attribute
 RpcOperationType    getRpcOperation()                              Gets the "rpcOperation" element
 void                setMessageId(java.lang.String messageId)       Sets the "message-id" attribute
 void                setRpcOperation(RpcOperationType rpcOperation) Sets the "rpcOperation" element
 MessageIdType       xgetMessageId()                                Gets (as xml) the "message-id" attribute
 void                xsetMessageId(MessageIdType messageId)         Sets (as xml) the "message-id" attribute

Interface xmlbeans.RpcOperationType
{no methods other than those inherited from XmlObject and XmlTokenSource

Any advice on how to proceed will be greatly appreciated.

	- Andy


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org


RE: How to decode concrete type from abstract element?

Posted by Radu Preotiuc-Pietro <ra...@oracle.com>.
If you want the concrete type of an XmlObject, call xmlObject.schemaType(), if you want the static type, do MyXmlObjectClass.type.

If you want the name of the enclosing element, you need to do xmlObject.newCursor().getName() (Note that there's no "declared element"). Finally, if you want to print the object and the enclosing element name, call xmlObject.xmlText(new XmlOptions().setSaveOuter()).

Hope this helps,
Radu 

> -----Original Message-----
> From: Andy Putnins [mailto:putnins@lett.com] 
> Sent: Wednesday, December 03, 2008 5:28 AM
> To: user@xmlbeans.apache.org
> Cc: putnins@lett.com
> Subject: How to decode concrete type from abstract element?
> 
> I am using XMLbeans to bind Java objects to NETCONF (RFC 
> 4741) RPC messages.
> The schema fragment below shows an abstract element, 
> rpcOperation, of type rpcOperationType as the head of a 
> substitution group.
> 
> Using substitute(QName, SchemaType), I can easily create 
> concrete instances of the abstract element because I know the 
> concrete type a priori, but I can't figure out how go in the 
> opposite direction, i.e. extract the concrete type from the 
> abstract element.
> 
> Schema fragment:
>     <!--
>         <rpc> element
>     -->
>     <xs:complexType name="rpcType">
>         <xs:sequence>
>             <xs:element ref="rpcOperation" />
>         </xs:sequence>
>         <xs:attribute name="message-id" type="messageIdType" 
> use="required" />
>         <!-- Arbitrary attributes can be supplied with <rpc> 
> element. -->
>         <xs:anyAttribute processContents="lax" />
>     </xs:complexType>
> 
>     <!--
>         rpcOperationType: used as a base type for all NETCONF 
> operations
>     -->
>     <xs:complexType name="rpcOperationType" />
> 
>     <xs:element name="rpcOperation" type="rpcOperationType" 
> abstract="true" />
> 
> and a number of rpcOperationType substitution types and 
> corresponding elements, e.g.
> 
>     <xs:complexType name="xyzType">
>         <xs:complexContent>
>             <xs:extension base="rpcOperationType">
>                 <xs:sequence>
>                     {various protocol elements}
>                 </xs:sequence>
>             </xs:extension>
>         </xs:complexContent>
>     </xs:complexType>
>     <xs:element name="xyz" type="xyzType" 
> substitutionGroup="rpcOperation" />
> 
> When decoding a RPC message, how can I instantiate the 
> concrete element (e.g. xyz of type xyzType) from the abstract 
> rpcOperation element?
> 
> If I extract the abstract element using the only provided 
> getter (RpcDocument.getRpcOperation()), I get an xml-fragment 
> that has the actual type buried in it, but no obvious way to 
> recast it.
> 
> RpcDocument doc = RpcDocument.getRpc() contains:
> <xml-fragment message-id="1">
>   <urn:get xmlns:urn="urn:ietf:params:xml:ns:netconf:base:1.0"/>
> </xml-fragment>
> 
> but RpcOperationType op = doc.getRpcOperation() contains:
> <xml-fragment xmlns:urn="urn:ietf:params:xml:ns:netconf:base:1.0"/>
> 
> Looking at the above "op" fragment with a debugger shows that 
> the object is of type GetTypeImpl, and there is other 
> information in the object that identifies it's type, but I 
> don't see any method to extract this.
> 
> The generated methods are:
> 
> Interface xmlbeans.RpcDocument
> Method Summary
>  RpcType    addNewRpc()         Appends and returns a new 
> empty "rpc" element
>  RpcType    getRpc()            Gets the "rpc" element
>  void       setRpc(RpcType rpc) Sets the "rpc" element
> 
> Interface xmlbeans.RpcType
> Method Summary
>  RpcOperationType    addNewRpcOperation()                     
>       Appends and returns a new empty "rpcOperation" element
>  java.lang.String    getMessageId()                           
>       Gets the "message-id" attribute
>  RpcOperationType    getRpcOperation()                        
>       Gets the "rpcOperation" element
>  void                setMessageId(java.lang.String messageId) 
>       Sets the "message-id" attribute
>  void                setRpcOperation(RpcOperationType 
> rpcOperation) Sets the "rpcOperation" element
>  MessageIdType       xgetMessageId()                          
>       Gets (as xml) the "message-id" attribute
>  void                xsetMessageId(MessageIdType messageId)   
>       Sets (as xml) the "message-id" attribute
> 
> Interface xmlbeans.RpcOperationType
> {no methods other than those inherited from XmlObject and 
> XmlTokenSource
> 
> Any advice on how to proceed will be greatly appreciated.
> 
> 	- Andy
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
> For additional commands, e-mail: user-help@xmlbeans.apache.org
> 
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@xmlbeans.apache.org
For additional commands, e-mail: user-help@xmlbeans.apache.org