多个个性化模板数据类型
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>
如快照所示,分析程序为三个数组成员中的每个成员确定了正确的个性,并在每个成员的 元素中设置个性属性以指示适当的个性。