複数パーソナリティ テンプレート データ型
MULTIPLE_PERSONALITY データ型は、異なる時に異なるデータ型を保持できる値を表します。 このデータ型は、C 言語の 共用体 データ型に似ています。
*DataType: MULTIPLE_PERSONALITYは、C 言語の 共用体 データ型と同様に、複数の異なるデータ型に属する値を受け入れることができるデータ型を定義するようにテンプレートに指示します。 MULTIPLE_PERSONALITY データ型は、値の ID (つまり、データ型) を決定しようと試み、テンプレートで値が識別されたデータ型に属するように明示的に定義された場合と同じ XML を出力します。 つまり、MULTIPLE_PERSONALITY データ型が文字列または整数または SYMBOL を保持するように定義され、値が実際に整数を保持している場合、XML 出力は整数データ型のものになります。
また、パーソナリティ タグ属性は、出力された値のデータ型をクライアントが判断するのに役立つように発行されます。 フィルターは、潜在的な各データ型を使用して値を解析することによって、値のデータ型を決定します。 入力値の最大量に正常に一致するデータ型が選択されます。 タイが発生した場合、リストの最初に表示される要素の種類が選択されます。
注: この評価アルゴリズムを使いこなすことができる値構文を構築できるため、一覧表示する要素の種類を選択するときは注意が必要です。 型は、解析アルゴリズムによって十分に区別できる必要があります。 たとえば、パーサー フィルターは XML 構文を認識しないため、2 つの XML_TYPE データ型を区別できません。 ただし、このような場合、候補データ型の定義には、パーサーがそれらを区別するのに役立つ *ArrayLabel ディレクティブを含めることができます。
次のディレクティブを使用して、MULTIPLE_PERSONALITY データ型を定義します。
*ElementType (必須)。 この値が想定する可能性のあるデータ型を定義するテンプレート名の一覧。
*ElementTags (必須)。 クライアントが実際に値に割り当てられているデータ型を識別するのに役立つタグの一覧。 指定されるタグの数は、*ElementType にリストされているテンプレートの数と同じである必要があります。 タグは、値を表す生成された XML 要素のパーソナリティ属性に表示されます。 たとえば、データ型が複数のパーソナリティ データ型の配列である場合、配列の個々のメンバーを表す要素にはパーソナリティ属性が含まれます。 配列自体に定義されたパーソナリティがないため、配列全体を表す要素にはパーソナリティ属性は含まれません。代わりに、配列の個々のメンバーには、独自の個別のパーソナリティ属性値があります。
次のテンプレートを考慮してください。
*Template: INT_OR_QUALNAME_EX
{
*Type: DATATYPE
*DataType: MULTIPLE_PERSONALITY
*ElementType: (INTEGER, QUALNAME_EX, QUOTEDSTRING)
*ElementTags: (integer, QualNameEx, QuotedString)
}
このテンプレートは、INTEGER 値、QUALNAME_EX 値、または QUOTEDSTRING 値を保持できるデータ型を定義します。 選択されたデータ型は、対応するユーザー定義 ElementTag で識別されます。
次の GDL エントリについて考えてみましょう。
*rcNameID: ( RESDLL.stdname.467 )
*rcNameID: (0x117 )
次の RC_NAME_ID2 テンプレートについて考えてみましょう。
*Template: RC_NAME_ID2
{
*Name: "*rcNameID"
*Type: ATTRIBUTE
*ValueType: INT_OR_QUALNAME_EX
*Additive: LEAST_TO_MOST_RECENT
}
GDL エントリが上記のテンプレートによって解釈される場合、結果の XML 出力は次のようになります。
<GDL_ATTRIBUTE Name="*rcNameID" Personality="QualNameEx" >
<feature xsi:type="GDLW_string">RESDLL</feature>
<option xsi:type="GDLW_string">stdname</option>
<resourceID xsi:type="GDLW_int">467</resourceID>
</GDL_ATTRIBUTE>
<GDL_ATTRIBUTE Name="*rcNameID" Personality="integer"
xsi:type="GDLW_int" >279</GDL_ATTRIBUTE>
MULTIPLE_PERSONALITY 型から生成される XML 出力と実際の型の唯一の違いは、値の実際のデータ型をクライアントに通知するために追加される追加のパーソナリティ タグ属性です。
たとえば、次のように、配列の各メンバーが MULTIPLE_PERSONALITY 型である配列を作成できます。
*Template: DT_ARRAY_OF_MP
{
*Type: DATATYPE
*DataType: ARRAY
*ElementType: INT_OR_QUALNAME_EX
*RequiredDelimiter: ","
*OptionalDelimiter: "<20 09>"
*ElementTags: (ArrayMember)
*ArraySize: *
}
*Template: ARRAY_OF_MP
{
*Name: "*rcNameID_List"
*Type: ATTRIBUTE
*ValueType: DT_ARRAY_OF_MP
}
また、上記のテンプレートを使用して、次のインスタンス データを処理できます。これは、3 つの複数のパーソナリティ オブジェクトを含む配列であり、それぞれが異なるパーソナリティを持ちます。
*rcNameID_List:( RESDLL.stdname.467, 0x117, "Quote" )
この処理により、次の XML スナップショットが生成されます。
<GDL_ATTRIBUTE Name="*rcNameID_List" >
<ArrayMember Personality="QualNameEx">
<feature xsi:type="GDLW_string">RESDLL</feature>
<option xsi:type="GDLW_string">stdname</option>
<resourceID xsi:type="GDLW_int">467</resourceID>
</ArrayMember>
<ArrayMember Personality="integer" xsi:type="GDLW_int">279</ArrayMember>
<ArrayMember Personality="QuotedString" xsi:type="GDLW_string">Quote</ArrayMember>
</GDL_ATTRIBUTE>
スナップショットが示すように、パーサーは 3 つの配列メンバーのそれぞれに対して正しいパーソナリティを決定し、各メンバーの要素にパーソナリティ属性を設定して、適切なパーソナリティを示します。