Skip to main content

XML スキーマからのクラスの生成

このページでは、XML スキーマで定義された型に対応する XML 対応クラスのセットを生成する方法について説明します。

Note:

使用するどの XML ドキュメントの XML 宣言にも、そのドキュメントの文字エンコードを明記する必要があります。これにより、ドキュメントが宣言どおりにエンコードされます。文字エンコードが宣言されていない場合は、"入出力の文字エンコード" で説明されている既定値が使用されます。これらの既定値が正しくない場合は、XML 宣言を修正して、実際に使用されている文字セットを指定するようにします。

クラスの生成

XML スキーマで定義された型に対応する XML 対応クラスを生成するには、%XML.Utils.SchemaReaderOpens in a new tab クラスの Process() メソッドを使用します。このメソッドを使用するには、以下の操作を実行します。

  1. %XML.Utils.SchemaReaderOpens in a new tab のインスタンスを作成します。

  2. 必要に応じて、このインスタンスの動作を制御するプロパティを設定します。特に、以下のプロパティを設定できます (そのほとんどはブール値)。

    • KeepEmptyClasses。このオプションにより、プロパティを持たない未使用のクラスを保存するかどうかを指定します。このプロパティが 1 の場合、そのようなクラスが生成プロセスの最後に削除されなくなります。選択しない場合は、削除されます。

    • NoArrayProperties。配列プロパティの生成を制御します。このプロパティが 1 の場合、配列プロパティが生成されない代わりに別の形式が生成されます。"生成されたクラスの詳細" の "配列プロパティの作成" を参照してください。

    • GenerateXMLNIL。生成されたクラスの使用可能なプロパティに対して、XMLNIL プロパティ・パラメータの指定を制御します。

      このオプションは nillable="true" で指定された XML 要素に対応する各プロパティに適用されます。このプロパティが 1 の場合、XMLNIL=1 がプロパティ定義に追加されます。それ以外の場合、このパラメータの追加はありません。このパラメータの詳細は、"空文字列および NULL 値の処理" を参照してください。

    • GenerateXMLNILNOOBJECT。生成されたクラスの使用可能なプロパティに対して、XMLNILNOOBJECT プロパティ・パラメータを指定するかどうかを制御します。

      このオプションは nillable="true" で指定された XML 要素に対応する各プロパティに適用されます。このプロパティが 1 の場合、XMLNILNOOBJECT=1 がプロパティ定義に追加されます。それ以外の場合、このパラメータの追加はありません。このパラメータの詳細は、"空文字列および NULL 値の処理" を参照してください。

    • CompileClasses。生成されたクラスを自動的にコンパイルするかどうかを制御します。

    • MakeNamespaceNAMESPACE パラメータを指定するかどうかを制御します。この場合、NAMESPACE は、スキーマで targetNamespace の値に設定されます。

      このプロパティが 1 の場合、NAMESPACE は指定されません。

      どのような場合でも、これは 1 に指定することをお勧めします。これは、すべての XML 対応クラスは、XML ネームスペースに割り当てる必要があるためです。

    • MakePersistent。生成されたクラスが %PersistentOpens in a new tab を拡張するかどうかを制御します。

    • MakeRelationshipsIndexRelationship、および 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 のクラス・ドキュメントを参照してください。

  3. オプションとして、追加設定についての情報を含める InterSystems IRIS 多次元配列を作成します。詳細は、%XML.Utils.SchemaReaderOpens in a new tab のクラス・ドキュメントの Process() メソッドを参照してください。

  4. インスタンスの 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 タイプに使用される InterSystems IRIS データ型
ソース・ドキュメントの XSD タイプ 生成された InterSystems IRIS クラスのデータ型
anyURI %xsd.anyURIOpens in a new tab
base64Binary %xsd.base64BinaryOpens in a new tab または %Stream.GlobalBinaryOpens in a new tab。選択したオプションによって異なります。各文字列が文字列長の制限を超えるかどうかを開発者が確認する必要があります。制限を超える場合は、生成されたプロパティを %xsd.base64BinaryOpens in a new tab から適切なストリーム・クラスに変更する必要があります。
boolean %BooleanOpens in a new tab
byte %xsd.byteOpens in a new tab
date %DateOpens in a new tab
dateTime %TimeStampOpens in a new tab
decimal %NumericOpens in a new tab
double %xsd.doubleOpens in a new tab
float %xsd.floatOpens in a new tab
hexBinary %xsd.hexBinaryOpens in a new tab
int %xsd.intOpens in a new tab
integer %IntegerOpens in a new tab
long %IntegerOpens in a new tab
negativeInteger %xsd.negativeIntegerOpens in a new tab
nonNegativeInteger %xsd.nonNegativeIntegerOpens in a new tab
nonPositiveInteger %xsd.nonPositiveIntegerOpens in a new tab
positiveInteger %xsd.positiveIntegerOpens in a new tab
short %xsd.shortOpens in a new tab
string %StringOpens in a new tab (メモ : 各文字列が文字列長の制限を超えるかどうかを開発者が確認する必要があります。制限を超える場合は、生成されたタイプを適切なストリーム・クラスに変更する必要があります。)
time %TimeOpens in a new tab
unsignedByte %xsd.unsignedByteOpens in a new tab
unsignedInt %xsd.unsignedIntOpens in a new tab
unsignedLong %xsd.unsignedLongOpens in a new tab
unsignedShort %xsd.unsignedShortOpens in a new tab
タイプを指定しない場合 %StringOpens in a new tab

生成されたプロパティのプロパティ・キーワード

%XML.Utils.SchemaReaderOpens in a new tab は、生成したプロパティごとに、スキーマ内の情報を使用して、以下のキーワードも自動的に設定します。

  • 説明

  • 必須

  • ReadOnly (対応する要素または属性が、fixed 属性で定義されている場合)

  • InitialExpression (この値は、スキーマ内の fixed 属性から取り込まれます)

  • リレーションシップに関連するキーワード

生成されたプロパティのパラメータ

%XML.Utils.SchemaReaderOpens in a new tab は、生成したプロパティごとに、XMLNAMEXMLPROJECTION など、XML に関連するパラメータすべてを必要に応じて自動的に設定します。これらの詳細は、"オブジェクトの XML への投影" を参照してください。また、MAXVALMINVALVALUELIST など、他のパラメータも必要に応じて設定されます。

生成されたクラスをきわめて長い文字列に合わせて調整する方法

まれに、文字列長の制限を超える、きわめて長い文字列やバイナリ値に対応できるように、生成されたクラスの編集が必要な場合があります。

どのような文字列タイプでも、XML スキーマには、文字列がどのくらいの長さになる可能性があるかを示す情報は含まれません。%XML.Utils.SchemaReaderOpens in a new tab では、文字列の任意の値を %StringOpens in a new tab クラスにマップし、base64Binary の任意の値が %xsd.base64BinaryOpens in a new tab クラスにマップされます。クラスが保持することになっているデータによっては、これらの選択肢が不適切になる場合があります。

生成されたクラスを使用する前に、以下を行う必要があります。

FeedbackOpens in a new tab