共用方式為


多個個性範本數據類型

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>

如快照集所示,剖析器會判斷這三個陣列成員中每個成員的正確個性,並在每個成員的 元素中設定個性屬性,以指出適當的個性。