XML スキーマからのクラスの生成
このページでは、XML スキーマで定義された型に対応する XML 対応クラスのセットを生成する方法について説明します。
使用するどの XML ドキュメントの XML 宣言にも、そのドキュメントの文字エンコードを明記する必要があります。これにより、ドキュメントが宣言どおりにエンコードされます。文字エンコードが宣言されていない場合は、"入出力の文字エンコード" で説明されている既定値が使用されます。これらの既定値が正しくない場合は、XML 宣言を修正して、実際に使用されている文字セットを指定するようにします。
クラスの生成
XML スキーマで定義された型に対応する XML 対応クラスを生成するには、%XML.Utils.SchemaReaderOpens in a new tab クラスの Process() メソッドを使用します。このメソッドを使用するには、以下の操作を実行します。
-
%XML.Utils.SchemaReaderOpens in a new tab のインスタンスを作成します。
-
必要に応じて、このインスタンスの動作を制御するプロパティを設定します。特に、以下のプロパティを設定できます (そのほとんどはブール値)。
-
KeepEmptyClasses。このオプションにより、プロパティを持たない未使用のクラスを保存するかどうかを指定します。このプロパティが 1 の場合、そのようなクラスが生成プロセスの最後に削除されなくなります。選択しない場合は、削除されます。
-
NoArrayProperties。配列プロパティの生成を制御します。このプロパティが 1 の場合、配列プロパティが生成されない代わりに別の形式が生成されます。"生成されたクラスの詳細" の "配列プロパティの作成" を参照してください。
-
GenerateXMLNIL。生成されたクラスの使用可能なプロパティに対して、XMLNIL プロパティ・パラメータの指定を制御します。
このオプションは nillable="true" で指定された XML 要素に対応する各プロパティに適用されます。このプロパティが 1 の場合、XMLNIL=1 がプロパティ定義に追加されます。それ以外の場合、このパラメータの追加はありません。このパラメータの詳細は、"空文字列および NULL 値の処理" を参照してください。
-
GenerateXMLNILNOOBJECT。生成されたクラスの使用可能なプロパティに対して、XMLNILNOOBJECT プロパティ・パラメータを指定するかどうかを制御します。
このオプションは nillable="true" で指定された XML 要素に対応する各プロパティに適用されます。このプロパティが 1 の場合、XMLNILNOOBJECT=1 がプロパティ定義に追加されます。それ以外の場合、このパラメータの追加はありません。このパラメータの詳細は、"空文字列および NULL 値の処理" を参照してください。
-
CompileClasses。生成されたクラスを自動的にコンパイルするかどうかを制御します。
-
MakeNamespace。NAMESPACE パラメータを指定するかどうかを制御します。この場合、NAMESPACE は、スキーマで targetNamespace の値に設定されます。
このプロパティが 1 の場合、NAMESPACE は指定されません。
どのような場合でも、これは 1 に指定することをお勧めします。これは、すべての XML 対応クラスは、XML ネームスペースに割り当てる必要があるためです。
-
MakePersistent。生成されたクラスが %PersistentOpens in a new tab を拡張するかどうかを制御します。
-
MakeRelationships、IndexRelationship、および ParentChildRelationship。永続クラス間の接続の形式を制御します。スキーマに他の <complexType> B の <sequence> で構成される <complexType> A がある場合、これらのプロパティが適用されます。コードによりプロパティ A が含まれる永続クラスが生成されるとき、このプロパティで 3 つの形式があります。これは、オブジェクトのリスト、一対多のリレーションシップ (既定)、または親子リレーションシップとして定義できます。組み合わせ内容をまとめたテーブルを以下に示します。
MakeRelationships IndexRelationship ParentChildRelationship 生成されるプロパティ A の形式 1 1 0 インデックスが存在しない一対多のリレーションシップ 1 1 0 多側でインデックスが存在する一対多のリレーションシップ 1 ParentChildRelationship が 1 の場合はこのプロパティ 1 親子リレーションシップ 0 0 0 オブジェクトのリスト -
CascadeDeletes。生成されるクラスで %OnDelete() コールバック・メソッドの実装も生成するかどうかを指定します。生成された %OnDelete() メソッドによって、クラスで参照されるすべての永続オブジェクトが削除されます。ParentChildRelationship が 0 の場合のみ使用します。親子リレーションシップは既に同様のロジックを提供しています。
Note:このオプションを使用する場合や生成されたクラスを変更する場合、必要に応じて必ず %OnDelete() コールバック・メソッドを変更してください。
-
AddIdentity。オブジェクトに対する InterSystems IRIS 内部識別子の生成方法を指定します (永続クラスの場合)。選択肢は以下のとおりです。
-
"" — この場合、ここで説明したいずれのプロパティも追加されません。
-
"ID" — この場合、各永続クラスに以下のプロパティが追加されます。
Property %identity As %XML.Id (XMLNAME="_identity", XMLPROJECTION="ATTRIBUTE") [Transient]; -
"OID" — この場合、各永続クラスに以下のプロパティが追加されます。
Property %identity As %XML.Oid (XMLNAME="_identity", XMLPROJECTION="ATTRIBUTE") [Transient]; -
"GUID" — この場合、各永続クラスに以下のプロパティが追加されます。
Property %identity As %XML.GUID (XMLNAME="_identity", XMLPROJECTION="ATTRIBUTE") [Transient];
"特殊なトピック" も参照してください。
-
詳細は、%XML.Utils.SchemaReaderOpens in a new tab のクラス・ドキュメントを参照してください。
-
-
オプションとして、追加設定についての情報を含める InterSystems IRIS 多次元配列を作成します。詳細は、%XML.Utils.SchemaReaderOpens in a new tab のクラス・ドキュメントの Process() メソッドを参照してください。
-
インスタンスの Process() メソッドを呼び出します。
method Process(LocationURL As %String, Package As %String = "Test", ByRef Features As %String) as %Status {}-
LocationURL は、スキーマの URL にするか、スキーマ・ファイルの名前 (完全なパスを含む) にする必要があります。
-
Package は、生成されたクラスを配置するパッケージの名前です。パッケージを指定しないと、InterSystems IRIS は、サービス名をパッケージ名として使用します。
-
Features は、前の手順で必要に応じて作成した多次元配列です。
-
既定のデータ型
%XML.Utils.SchemaReaderOpens in a new tab は、生成したプロパティごとに、スキーマに指定されている XSD タイプに応じて、適切な InterSystems IRIS データ型クラスを自動的に使用します。以下のテーブルに、XSD タイプおよび対応するデータ型を示します。
生成されたプロパティのプロパティ・キーワード
%XML.Utils.SchemaReaderOpens in a new tab は、生成したプロパティごとに、スキーマ内の情報を使用して、以下のキーワードも自動的に設定します。
-
説明
-
必須
-
ReadOnly (対応する要素または属性が、fixed 属性で定義されている場合)
-
InitialExpression (この値は、スキーマ内の fixed 属性から取り込まれます)
-
リレーションシップに関連するキーワード
生成されたプロパティのパラメータ
%XML.Utils.SchemaReaderOpens in a new tab は、生成したプロパティごとに、XMLNAME、XMLPROJECTION など、XML に関連するパラメータすべてを必要に応じて自動的に設定します。これらの詳細は、"オブジェクトの XML への投影" を参照してください。また、MAXVAL、MINVAL、VALUELIST など、他のパラメータも必要に応じて設定されます。
生成されたクラスをきわめて長い文字列に合わせて調整する方法
まれに、文字列長の制限を超える、きわめて長い文字列やバイナリ値に対応できるように、生成されたクラスの編集が必要な場合があります。
どのような文字列タイプでも、XML スキーマには、文字列がどのくらいの長さになる可能性があるかを示す情報は含まれません。%XML.Utils.SchemaReaderOpens in a new tab では、文字列の任意の値を %StringOpens in a new tab クラスにマップし、base64Binary の任意の値が %xsd.base64BinaryOpens in a new tab クラスにマップされます。クラスが保持することになっているデータによっては、これらの選択肢が不適切になる場合があります。
生成されたクラスを使用する前に、以下を行う必要があります。
-
生成されたクラスを調べて、%StringOpens in a new tab または %xsd.base64BinaryOpens in a new tab と定義されているプロパティを見つけます。これらのクラス、特にこれらのプロパティを使用するコンテキストを検討します。
-
文字列長の制限を超える文字列を %StringOpens in a new tab プロパティに含めることが必要と判断した場合、そのプロパティを適切な文字ストリームに再定義します。同様に、同じ制限を超える文字列を %xsd.base64BinaryOpens in a new tab プロパティに含めることが必要と判断した場合、そのプロパティを適切なバイナリ・ストリームに再定義します。
-
プロパティのタイプが %StringOpens in a new tab、%xsd.stringOpens in a new tab、および %BinaryOpens in a new tab の場合、MAXLEN プロパティ・パラメータは既定で 50 文字であることにも注意してください。正しい検証ができるように、上限をさらに高く指定することが必要な場合もあります。
(プロパティのタイプが %xsd.base64BinaryOpens in a new tab の場合、MAXLEN は "" になります。これは、検証の際に長さがチェックされないことを意味します。ただし、文字列長の制限は適用されます。)