Condividi tramite


Tipi di dati per più modelli di personalità

Un tipo di dati MULTIPLE_PERSONALITY rappresenta un valore che può contenere tipi di dati diversi in momenti diversi. Questo tipo di dati è simile al tipo di dati unione del linguaggio C.

*DataType: MULTIPLE_PERSONALITY indirizza un modello a definire un tipo di dati che può accettare valori appartenenti a diversi tipi di dati, in modo analogo a un tipo di dati unione del linguaggio C. Il tipo di dati MULTIPLE_PERSONALITY tenta di determinare l'identità (ovvero il tipo di dati) del valore e restituisce lo stesso codice XML come se il valore fosse definito in modo esplicito nel modello per appartenere al tipo di dati identificato. In altre parole, se un tipo di dati MULTIPLE_PERSONALITY è stato definito per contenere una stringa o un numero intero o SYMBOL e se il valore ha effettivamente un numero intero, l'output XML sarà quello per un tipo di dati integer.

Viene inoltre generato un attributo di tag di personalità per consentire ai client di determinare il tipo di dati del valore generato. Il filtro determina il tipo di dati del valore analizzando il valore usando ogni tipo di dati potenziale. Viene scelto il tipo di dati che corrisponde correttamente alla quantità massima del valore di input. In caso di pareggio, verrà selezionato il tipo di elemento visualizzato per primo nell'elenco.

Nota È possibile costruire sintassi di valore che possono ingannare questo algoritmo di valutazione, quindi prestare attenzione quando si selezionano i tipi di elemento da elencare. I tipi devono essere sufficientemente distinguibili dall'algoritmo di analisi. Ad esempio, poiché il filtro parser non riconosce alcuna sintassi XML, non può distinguere tra due tipi di dati XML_TYPE. Tuttavia, in questi casi, la definizione dei tipi di dati candidati può includere una direttiva *ArrayLabel che consentirà al parser di distinguerle tra di esse.

Per definire il tipo di dati MULTIPLE_PERSONALITY vengono usate le direttive seguenti:

  • *ElementType (obbligatorio). Elenco di nomi di modello che definisce i potenziali tipi di dati che questo valore potrebbe presupporre.

  • *ElementTags (obbligatorio). Elenco di tag che consentono al client di identificare il tipo di dati effettivamente assegnato al valore. Il numero di tag forniti deve essere uguale al numero di modelli elencati in *ElementType. Il tag verrà visualizzato in un attributo di personalità nell'elemento XML generato che rappresenta il valore. Ad esempio, se il tipo di dati è una matrice di più tipi di dati di personalità, gli elementi che rappresentano i singoli membri della matrice conterranno l'attributo di personalità. L'elemento che rappresenta l'intera matrice non conterrà l'attributo di personalità perché la matrice stessa non ha una personalità definita; Al contrario, i singoli membri della matrice hanno un proprio valore di attributo di personalità distinto.

Si consideri il modello seguente.

*Template:  INT_OR_QUALNAME_EX
{
    *Type:  DATATYPE
    *DataType:   MULTIPLE_PERSONALITY
    *ElementType:  (INTEGER, QUALNAME_EX, QUOTEDSTRING)
    *ElementTags: (integer, QualNameEx, QuotedString)
}

Questo modello definisce un tipo di dati che può contenere un valore INTEGER, QUALNAME_EX valore o un valore QUOTEDSTRING. Qualsiasi tipo di dati selezionato verrà identificato con l'elemento ElementTag definito dall'utente corrispondente.

Prendere in considerazione le seguenti voci GDL.

*rcNameID:     ( RESDLL.stdname.467 )  
*rcNameID:      (0x117 )  

Prendere in considerazione il seguente modello RC_NAME_ID2.

*Template:  RC_NAME_ID2
{
    *Name:  "*rcNameID"
    *Type:  ATTRIBUTE
    *ValueType:  INT_OR_QUALNAME_EX
    *Additive: LEAST_TO_MOST_RECENT
}

Se le voci GDL vengono interpretate dal modello precedente, l'output XML risultante sarà il seguente.

<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>

L'unica differenza tra l'output XML generato dal tipo di MULTIPLE_PERSONALITY e il tipo effettivo è l'attributo del tag di personalità aggiuntivo aggiunto per informare il client del tipo di dati effettivo del valore.

Ad esempio, è possibile creare una matrice in cui ogni membro della matrice è un tipo di MULTIPLE_PERSONALITY, come indicato di seguito.

*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
}

È inoltre possibile usare il modello precedente per elaborare i dati dell'istanza seguenti, ovvero una matrice che contiene tre oggetti personalità multipli, ognuno dei quali ha una personalità diversa.

*rcNameID_List:( RESDLL.stdname.467, 0x117, "Quote" )

Questa elaborazione produrrà lo snapshot XML seguente.

    <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>

Come illustrato nello snapshot, il parser ha determinato la personalità corretta per ognuno dei tre membri della matrice e ha impostato l'attributo di personalità nell'elemento di ogni membro per indicare la personalità appropriata.