2.4.2 XMLスキーマのユーザー定義データ型のマッピング

次に、サポートされているXMLスキーマのユーザー定義の単純なデータ型と、対応するOracle Tuxedo FML32のフィールド・データ型の一覧を示します。

表2-7 サポートされているXMLスキーマのユーザー定義データ型

XMLスキーマのユーザー定義データ型のマッピング Oracle Tuxedo FML32のフィールド・データ型 Oracle TuxedoプログラムのC/C++プリミティブ型 ノート
<xsd:anyType> FLD_MBSTRING char [] 要素タグがある全文のXMLドキュメントを作成する必要があります。
<xsd:simpleType> derived from built-in primitive simple data types プリミティブで単純な型の同等なFML32フィールド型(表2-3を参照) プリミティブで単純な型の同等なCプリミティブ・データ型(表2-3) <xsd:restriction>で定義されているファセットは、Oracle Tuxedoでは適用されません。
<xsd:simpleType>defined with <xsd:list> FLD_MBSTRING char [] <xsd:anyType>と同じです。スキーマのコンプライアンスは、Oracle Tuxedoでは適用されません。
<xsd:simpleType> defined with <xsd:union> FLD_MBSTRING char [] <xsd:anyType>と同じです。スキーマのコンプライアンスは、Oracle Tuxedoでは適用されません。
<xsd:complexType> defined with <xsd:simpleContent> FLD_MBSTRING char [] <xsd:anyType>と同じです。スキーマのコンプライアンスは、Oracle Tuxedoでは適用されません。
<xsd:complexType> defined with <xsd:complexContent> FLD_MBSTRING char [] <xsd:anyType>と同じです。スキーマのコンプライアンスは、Oracle Tuxedoでは適用されません。
<xsd:complexType>defined with shorthand <xsd:complexContent>, sub-elements composited with sequence or all FLD_FML32 FBFR32 * embedded fml32 buffer 複合型の各サブ要素は埋込みFML32フィールドとして定義されます。
<xsd:complexType> defined with shorthand <xsd:complexContent>, sub-elements composited with choice FML_FML32 FBFR32 * embedded fml32 buffer 複合型の各サブ要素は埋込みFML32フィールドとして定義されます。

fml32バッファに追加できるサブ・フィールドは1つのみです。

<xsd:complexType>とサブ要素は、順番に従ってコンポジット化されます。complexTypeには属性と要素を含めることができます。 FLD_FML32 FBFR32 * embedded fml32 buffer 複合型の各サブ要素は埋込みFML32フィールドとして定義されます。

次のサンプルでは、XMLスキーマのユーザー定義データ型のデータを、Oracle Tuxedoプログラムで作成する方法を示します:

表2-8 XMLスキーマのユーザー定義型のサンプル - プリミティブで単純な型から派生したxsd:simpleType

XMLスキーマ定義
-
<xsd:element name=”Grade” type=”Alphabet” />
<xsd:simpleType name=”Alphabet”>
<xsd:restriction base=”xsd:string”>
<xsd:maxLength value=”1” />
<xsd:pattern value=”[A-Z]” />
</xsd:restriction>
</xsd:simpleType>
対応するFML32フィールド定義(FLD_STRING)
- # Field_name Field_type Field_flag Field_comments Grade string -
C疑似コード
-
char grade[2];
FBFR32 * request;
...
grade[0] = ‘A’; grade[1] = ‘\0’;
Fadd32( request, Grade, (char *)grade, 0);

表2-9 XMLスキーマのユーザー定義型のサンプル - xsd:listで定義されたxsd:simpleType

XMLスキーマ定義(ターゲット・ネームスペース"urn:sample.org")
-
<xsd:element name=”Users” type=”namelist” />
<xsd:simpleType name=”namelist”>
<xsd:list itemType=”xsd:NMTOKEN”>
</xsd:simpleType>
対応するFML32フィールド定義(FLD_MBSTRING)
-
Field_name Field_type Field_flag Field_comments
Users mbstring -
C疑似コード
-
char * user[5];
char users[...];
char * mbpacked;
FLDLEN32 mbsize = 1024;
FBFR32 * request;
...
sprintf(users, “<n1:Users xmlns:n1=\”urn:sample.org\”>”);
for ( i = 0 ; i < 5 ; i++ ) {
strcat(users, user[i]);
strcat(users, “ “);
}
strcat(users, “</n1:Users>“);
...
mbpacked = malloc(mbsize);
/* prepare mbstring*/
Fmbpack32(“utf-8”, users, strlen(users), mbpacked, &mbsize, 0);
Fadd32( request, Users, mbpacked, mbsize);

ノート:

次の表に示すように、外部Webサービスの呼出しで属性がサポートされるのは、"<xs:attribute name="[name]" type="[type]"/>"という形式を使用した場合のみです。"fixed="などの修飾子は現在サポートされていません。

表2-10 外部サービス・スキーマ属性の使用例

XMLスキーマ定義
-
<xs:element name="add">
<xs:complexType>
<xs:sequence>
<xs:element name="param0" nillable="true" type="xs:int"/>
<xs:element name="param1" nillable="true" type="xs:int"/>
</xs:sequence>
<xs:attribute name="aType" type="xs:string"/>
</xs:complexType>
</xs:element>
対応するFML32フィールド定義
-
…
#name rel-number type flags comment
#---- ---------- ---- ------ -------
add 1 fml32 - fullname=add, schema=axis2:add
aType 3 string - fullname=aType, schema=xs:string
param0 4 long - fullname=param0, schema=xs:int
param1 5 long - fullname=param1, schema=xs:int
対応するSALTメタデータ・リポジトリ定義
-
…
servicemode=webservice
inbuf=FML32
outbuf=FML32
errbuf=FML32
param=add
access=in
paramschema=XSD_E:add@http://calc.sample
type=fml32
(
param=param0
access=in
paramschema=XSD_E:param0@http://calc.sample
type=long
primetype=int
 
param=param1
access=in
paramschema=XSD_E:param1@http://calc.sample
type=long
primetype=int
 
param=aType
access=in
paramschema=XSD_E:attribute:aType@http://calc.sample
type=string
primetype=string
 
)
…
対応するサンプル疑似コード
-
FBFR32 *f, *fin;
long len;
FLDLEN32 len2;
long inputnum1, inputnum2;
char ret_val[25];
char ret_attr[25];
char *programName;
int counter;
...
char addType[25];
strcpy(addType,argv[1]);
Fadd32(fin, aType, addType, 0);
inputnum1 = atoi(argv[2]);
Fadd32(fin, param0, (char *)&inputnum1, 0);
inputnum1 = atoi(argv[2]);
Fadd32(fin, param0, (char *)&inputnum1, 0);
Fadd32(f, add, (char *)fin, 0)
tpcall("add", (char *)f, 0, (char **)&f, &len, TPSIGRSTRT)