Vários tipos de dados de modelo de personalidade
Um tipo de dados MULTIPLE_PERSONALITY representa um valor que pode conter diferentes tipos de dados em momentos diferentes. Esse tipo de dados é semelhante ao tipo de dados união da linguagem C.
*DataType: MULTIPLE_PERSONALITY direciona um modelo para definir um tipo de dados que pode aceitar valores que pertencem a vários tipos de dados diferentes, assim como um tipo de dados de união de linguagem C. O tipo de dados MULTIPLE_PERSONALITY tenta determinar a identidade (ou seja, o tipo de dados) do valor e produzirá o mesmo XML como se o valor fosse explicitamente definido no modelo para pertencer ao tipo de dados identificado. Em outras palavras, se um tipo de dados MULTIPLE_PERSONALITY tiver sido definido para manter uma cadeia de caracteres ou inteiro ou SYMBOL e, se o valor realmente tiver um inteiro, a saída XML será aquela para um tipo de dados inteiro.
Um atributo de marca de personalidade também é emitido para ajudar os clientes a determinar o tipo de dados do valor que foi emitido. O filtro determina o tipo de dados do valor analisando o valor usando cada tipo de dados potencial. O tipo de dados que corresponde com êxito à maior quantidade do valor de entrada é escolhido. No caso de um empate, o tipo de elemento que aparece primeiro na lista será selecionado.
Nota Você pode construir sintaxes de valor que podem enganar esse algoritmo de avaliação, portanto, tenha cuidado ao selecionar os tipos de elemento a serem listados. Os tipos devem ser suficientemente diferenciados pelo algoritmo de análise. Por exemplo, como o filtro do analisador não reconhece nenhuma sintaxe XML, ele não pode distinguir entre dois tipos de dados XML_TYPE. No entanto, nesses casos, a definição dos tipos de dados candidatos pode incluir uma diretiva *ArrayLabel que ajudará o analisador a distinguir entre eles.
As seguintes diretivas são usadas para definir o tipo de dados MULTIPLE_PERSONALITY:
*ElementType (Obrigatório). Uma lista de nomes de modelo que define os tipos de dados potenciais que esse valor poderia assumir.
*ElementTags (Obrigatório). Uma lista de marcas para ajudar o cliente a identificar o tipo de dados que é realmente atribuído ao valor. O número de marcas fornecidas deve ser igual ao número de modelos listados em *ElementType. A marca aparecerá em um atributo de personalidade no elemento XML gerado que representa o valor. Por exemplo, se o tipo de dados for uma matriz de vários tipos de dados de personalidade, os elementos que representam os membros individuais da matriz conterão o atributo de personalidade. O elemento que representa toda a matriz não conterá o atributo de personalidade porque a própria matriz não tem uma personalidade definida; Em vez disso, os membros individuais da matriz têm seu próprio valor de atributo de personalidade distinto.
Considere o modelo a seguir.
*Template: INT_OR_QUALNAME_EX
{
*Type: DATATYPE
*DataType: MULTIPLE_PERSONALITY
*ElementType: (INTEGER, QUALNAME_EX, QUOTEDSTRING)
*ElementTags: (integer, QualNameEx, QuotedString)
}
Este modelo define um tipo de dados que pode conter um valor INTEGER, QUALNAME_EX valor ou um valor QUOTEDSTRING. Qualquer tipo de dados selecionado será identificado com o ElementTag definido pelo usuário correspondente.
Considere as seguintes entradas GDL.
*rcNameID: ( RESDLL.stdname.467 )
*rcNameID: (0x117 )
E considere o modelo de RC_NAME_ID2 a seguir.
*Template: RC_NAME_ID2
{
*Name: "*rcNameID"
*Type: ATTRIBUTE
*ValueType: INT_OR_QUALNAME_EX
*Additive: LEAST_TO_MOST_RECENT
}
Se as entradas GDL forem interpretadas pelo modelo anterior, a saída XML resultante será a seguinte.
<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>
A única diferença entre a saída XML gerada do tipo MULTIPLE_PERSONALITY e o tipo real é o atributo de marca de personalidade adicional que é adicionado para informar o cliente sobre o tipo de dados real do valor.
Por exemplo, você pode criar uma matriz em que cada membro da matriz é um tipo MULTIPLE_PERSONALITY, da seguinte maneira.
*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
}
E você pode usar o modelo anterior para processar os dados de instância a seguir, que é uma matriz que contém três objetos de personalidade múltipla, cada um deles com uma personalidade diferente.
*rcNameID_List:( RESDLL.stdname.467, 0x117, "Quote" )
Esse processamento produzirá os seguintes instantâneo 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>
Como mostra o instantâneo, o analisador determinou a personalidade correta para cada um dos três membros da matriz e definiu o atributo de personalidade no elemento de cada membro para indicar a personalidade apropriada.