For C++, methods are generated to assist the user in getting, setting, or querying the choice construct variable. These methods are of the form get_elemName, set_elemName, and is_elemName where elemName would be replaced with the name of the element. The get method will return a pointer to the choice item only if it is the selected item; otherwise it will return null. The is method returns a boolean value of true if the element is the selected element or false otherwise. The set method sets the element to the given value and selects it by setting the t value.
C Example
The following is a common example of a choice construct with a nested sequence. This allows element a or element b or both elements to be present in an XML instance of the type:
<xsd:complexType name="AOrBOrBothType"> <xsd:choice> <xsd:sequence> <xsd:element name="a" type="xsd:string"/> <xsd:element name="b" type="xsd:string" minOccurs="0"/> </xsd:sequence> <xsd:element name="b" type="xsd:string"/> </xsd:choice> </xsd:complexType>
The generated C code for this type is as follows:
typedef struct AOrBOrBothType_1 { struct { unsigned bPresent : 1; } m; OSXMLSTRING a; OSXMLSTRING b; } AOrBOrBothType_1; /* choice tag constants */ #define T_AOrBOrBothType__seq1 1 #define T_AOrBOrBothType_b 2 typedef struct AOrBOrBothType { OSUINT16 t; union { /* t = 1 */ AOrBOrBothType_1 *_seq1; /* t = 2 */ OSXMLSTRING* b; } u; } AOrBOrBothType;
In this case, XBinder created the type AOrBOrBothType_1 to represent the inner sequence. It then added the _seq1 element to the main C type using this type. A user populating the structure would use the _seq1 element to specify element a or both and would use the b element to specify choice b.
C++ Example
The C++ code generated for the example schema above is as follows:
class AOrBOrBothType_1 : public OSXSDComplexType { public: struct { unsigned bPresent : 1; } m; OSXMLStringClass a; OSXMLStringClass b; ... } ; class AOrBOrBothType : public OSXSDComplexType { public: // tag constants enum { T__seq1 = 1, T_b = 2 } ; OSUINT16 t; union { /* t = 1 */ AOrBOrBothType_1 *_seq1; /* t = 2 */ OSXMLStringClass *b; } u; ... inline AOrBOrBothType_1* get__seq1 () { return u._seq1; } inline OSBOOL is__seq1 () { return (t == T__seq1); } void set__seq1 (const AOrBOrBothType_1& value); inline OSXMLStringClass* get_b () { return u.b; } inline OSBOOL is_b () { return (t == T_b); } void set_b (const OSXMLStringClass& value); } ;
This shows the generated get/set methods as well as the generated member variables
in the class. If the user wanted to set the class to the nested sequence value, the
set__seq1 method could be used. If the user
wanted to determine if the b element was selected
in the class and then get the value, the following code snippet could be used
(object is assumed to be an instance of the
AOrBOrBothType
class):
if (object.is_b()) { OSXMLStringClass* value = object.get_b(); }