多个个性化模板数据类型

MULTIPLE_PERSONALITY数据类型表示可以在不同时间保存不同数据类型的值。 此数据类型类似于 C 语言 联合 数据类型。

*DataType:MULTIPLE_PERSONALITY指示模板定义一个数据类型,该数据类型可以接受属于多个不同数据类型的值,这与 C 语言 联合 数据类型非常类似。 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>

如快照所示,分析程序为三个数组成员中的每个成员确定了正确的个性,并在每个成员的 元素中设置个性属性以指示适当的个性。