Varios tipos de datos de plantilla de personalidad
Un tipo de datos MULTIPLE_PERSONALITY representa un valor que puede contener diferentes tipos de datos en momentos diferentes. Este tipo de datos es similar al tipo de datos de unión del lenguaje C.
*DataType: MULTIPLE_PERSONALITY dirige una plantilla para definir un tipo de datos que puede aceptar valores que pertenecen a varios tipos de datos diferentes, como un tipo de datos de unión de lenguaje C. El MULTIPLE_PERSONALITY tipo de datos intenta determinar la identidad (es decir, el tipo de datos) del valor y generará el mismo XML que si el valor se definió explícitamente en la plantilla para pertenecer al tipo de datos identificado. En otras palabras, si se definió un tipo de datos MULTIPLE_PERSONALITY para contener una cadena o entero o SYMBOL, y si el valor contiene realmente un entero, la salida XML será para un tipo de datos entero.
También se emite un atributo de etiqueta de personalidad para ayudar a los clientes a determinar el tipo de datos del valor emitido. El filtro determina el tipo de datos del valor mediante el análisis del valor mediante cada tipo de datos potencial. Se elige el tipo de datos que coincide correctamente con la mayor cantidad del valor de entrada. En el caso de un empate, se seleccionará el tipo de elemento que aparece primero en la lista.
Nota Puede construir sintaxis de valor que puedan engañar a este algoritmo de evaluación, por lo que debe tener cuidado al seleccionar los tipos de elementos que se van a enumerar. Los tipos deben ser lo suficientemente distintivos por el algoritmo de análisis. Por ejemplo, dado que el filtro del analizador no reconoce ninguna sintaxis XML, no puede distinguir entre dos tipos de datos XML_TYPE. Sin embargo, en estos casos, la definición de los tipos de datos candidatos puede incluir una directiva *ArrayLabel que ayudará al analizador a distinguir entre ellos.
Las directivas siguientes se usan para definir el tipo de datos MULTIPLE_PERSONALITY:
*ElementType (obligatorio). Una lista de nombres de plantilla que define los posibles tipos de datos que podría suponer este valor.
*ElementTags (obligatorio). Lista de etiquetas para ayudar al cliente a identificar el tipo de datos que se asigna realmente al valor. El número de etiquetas proporcionadas debe ser igual al número de plantillas que se enumeran en *ElementType. La etiqueta aparecerá en un atributo de personalidad en el elemento XML generado que representa el valor. Por ejemplo, si el tipo de datos es una matriz de varios tipos de datos de personalidad, los elementos que representan a los miembros individuales de la matriz contendrán el atributo de personalidad. El elemento que representa toda la matriz no contendrá el atributo de personalidad porque la propia matriz no tiene una personalidad definida; en su lugar, los miembros individuales de la matriz tienen su propio valor de atributo de personalidad distinto.
Tenga en cuenta la siguiente plantilla.
*Template: INT_OR_QUALNAME_EX
{
*Type: DATATYPE
*DataType: MULTIPLE_PERSONALITY
*ElementType: (INTEGER, QUALNAME_EX, QUOTEDSTRING)
*ElementTags: (integer, QualNameEx, QuotedString)
}
Esta plantilla define un tipo de datos que puede contener un valor INTEGER, QUALNAME_EX valor o un valor QUOTEDSTRING. Cualquier tipo de datos seleccionado se identificará con el ElementTag definido por el usuario correspondiente.
Tenga en cuenta las siguientes entradas de GDL.
*rcNameID: ( RESDLL.stdname.467 )
*rcNameID: (0x117 )
Y tenga en cuenta la siguiente plantilla de RC_NAME_ID2.
*Template: RC_NAME_ID2
{
*Name: "*rcNameID"
*Type: ATTRIBUTE
*ValueType: INT_OR_QUALNAME_EX
*Additive: LEAST_TO_MOST_RECENT
}
Si las entradas GDL se interpretan mediante la plantilla anterior, la salida XML resultante será la siguiente.
<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>
La única diferencia entre la salida XML que se genera a partir del tipo MULTIPLE_PERSONALITY y el tipo real es el atributo de etiqueta de personalidad adicional que se agrega para informar al cliente del tipo de datos real del valor.
Por ejemplo, puede crear una matriz en la que cada miembro de la matriz sea un tipo MULTIPLE_PERSONALITY, como se indica a continuación.
*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
}
Y puede usar la plantilla anterior para procesar los siguientes datos de instancia, que es una matriz que contiene tres objetos de personalidad múltiples, cada uno de los cuales tiene una personalidad diferente.
*rcNameID_List:( RESDLL.stdname.467, 0x117, "Quote" )
Este procesamiento generará la siguiente instantánea 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 se muestra en la instantánea, el analizador determinó la personalidad correcta para cada uno de los tres miembros de la matriz y estableció el atributo de personalidad en el elemento de cada miembro para indicar la personalidad adecuada.