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