Condividi tramite


Più tipi di dati modello 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 dell'unione del linguaggio C.

*DataType: MULTIPLE_PERSONALITY indirizza un modello per definire un tipo di dati che può accettare valori appartenenti a diversi tipi di dati, molto simile a un tipo di dati dell'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 XML di se il valore è stato 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 mantenuto un intero, l'output XML sarà tale per un tipo di dati integer.

Viene generato anche 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 corrispondente alla quantità maggiore del valore di input. In caso di tie, verrà selezionato il tipo di elemento visualizzato prima nell'elenco.

Nota È possibile costruire sintassi dei valori che possono ingannare questo algoritmo di valutazione, quindi prestare attenzione quando si selezionano i tipi di elemento da elencare. I tipi devono essere sufficientemente distinti 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 aiuterà il parser a distinguere tra di essi.

Le direttive seguenti vengono usate per definire il tipo di dati MULTIPLE_PERSONALITY:

  • *ElementType (obbligatorio). Elenco di nomi di modelli che definiscono i potenziali tipi di dati che questo valore potrebbe assumere.

  • *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; invece, i singoli membri della matrice hanno il proprio valore di attributo di personalità distinto.

Prendere in considerazione 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 voci GDL seguenti.

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

Prendere in considerazione il modello di RC_NAME_ID2 seguente.

*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 di 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 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 più oggetti di personalità, 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 mostra lo snapshot, il parser ha determinato la personalità corretta per ognuno dei tre membri della matrice e impostare l'attributo di personalità nell'elemento di ogni membro per indicare la personalità appropriata.