MULTIPLE_PERSONALITY數據類型代表可以在不同時間保存不同數據類型的值。 此數據類型類似於 C 語言 聯集 資料類型。
*DataType:MULTIPLE_PERSONALITY 指示模板來定義一個數據類型,以接受屬於多種不同數據類型的值,就像 C 語言 union 數據類型一樣。 MULTIPLE_PERSONALITY數據類型會嘗試判斷值的識別(也就是數據類型),並將輸出與範本中明確定義的值屬於已識別數據類型相同的 XML。 換句話說,如果已定義MULTIPLE_PERSONALITY資料類型來保存字串或整數或 SYMBOL,而且如果值實際保留整數,則 XML 輸出會是整數數據類型的 。
也會發出個性標記屬性,協助客戶端判斷所發出值的數據類型。 篩選條件會逐一使用各個可能的數據類型剖析該值,以判斷該值的數據類型。 選擇成功匹配最大量的輸入值的數據類型。 發生並列情況時,將會選擇清單中首先出現的元素類型。
注意 您可以建構可欺騙此評估演算法的值語法,因此當您選取要列出的項目類型時,請小心。 型別必須能夠被剖析演算法充分區分。 例如,由於剖析器篩選無法辨識任何 XML 語法,因此無法區分兩個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
}
您可以使用上述範本來處理下列實例數據,這是一個數位列,其中包含三個多個個性物件,每一個都會有不同的個性。
*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>
如快照集所示,剖析器會判斷這三個陣列成員中每個成員的正確個性,並在每個成員的 元素中設定個性屬性,以指出適當的個性。