Partager via


Types de données de modèle de personnalité multiples

Un type de données MULTIPLE_PERSONALITY représente une valeur qui peut contenir différents types de données à différents moments. Ce type de données est similaire au type de données union du langage C.

*DataType : MULTIPLE_PERSONALITY indique à un modèle de définir un type de données qui peut accepter des valeurs qui appartiennent à plusieurs types de données différents, à l’instar d’un type de données union du langage C. Le type de données MULTIPLE_PERSONALITY tente de déterminer l’identité (c’est-à-dire le type de données) de la valeur et génère le même XML que si la valeur était explicitement définie dans le modèle pour appartenir au type de données identifié. En d’autres termes, si un type de données MULTIPLE_PERSONALITY a été défini pour contenir une chaîne, un entier ou un SYMBOLE, et si la valeur contenait réellement un entier, la sortie XML sera celle d’un type de données entier.

Un attribut de balise de personnalité est également émis pour aider les clients à déterminer le type de données de la valeur qui a été émise. Le filtre détermine le type de données de la valeur en analysant la valeur à l’aide de chaque type de données potentiel. Le type de données qui correspond à la plus grande quantité de la valeur d’entrée est choisi. En cas d’égalité, le type d’élément qui apparaît en premier dans la liste est sélectionné.

Note Vous pouvez construire des syntaxes de valeur qui peuvent tromper cet algorithme d’évaluation. Soyez donc prudent lorsque vous sélectionnez les types d’éléments à répertorier. Les types doivent être suffisamment distingués par l’algorithme d’analyse. Par exemple, étant donné que le filtre de l’analyseur ne reconnaît aucune syntaxe XML, il ne peut pas faire la distinction entre deux types de données XML_TYPE. Toutefois, dans ce cas, la définition des types de données candidats peut inclure une directive *ArrayLabel qui aidera l’analyseur à les distinguer.

Les directives suivantes sont utilisées pour définir le type de données MULTIPLE_PERSONALITY :

  • *ElementType (obligatoire). Liste de noms de modèles qui définit les types de données potentiels que cette valeur peut supposer.

  • *ElementTags (obligatoire). Liste de balises pour aider le client à identifier le type de données qui est réellement affecté à la valeur. Le nombre de balises fournies doit être égal au nombre de modèles répertoriés dans *ElementType. La balise apparaît dans un attribut de personnalité dans l’élément XML généré qui représente la valeur. Par exemple, si le type de données est un tableau de plusieurs types de données de personnalité, les éléments qui représentent les membres individuels du tableau contiennent l’attribut de personnalité. L’élément qui représente l’ensemble du tableau ne contient pas l’attribut de personnalité, car le tableau lui-même n’a pas de personnalité définie ; au lieu de cela, les membres individuels du tableau ont leur propre valeur d’attribut de personnalité distincte.

Considérez le modèle suivant.

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

Ce modèle définit un type de données qui peut contenir une valeur INTEGER, une valeur QUALNAME_EX ou une valeur QUOTEDSTRING. Quel que soit le type de données sélectionné, il est identifié avec l’élément ElementTag défini par l’utilisateur correspondant.

Considérez les entrées GDL suivantes.

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

Considérez également le modèle de RC_NAME_ID2 suivant.

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

Si les entrées GDL sont interprétées par le modèle précédent, la sortie XML résultante sera la suivante.

<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 seule différence entre la sortie XML générée à partir du type MULTIPLE_PERSONALITY et le type réel est l’attribut de balise de personnalité supplémentaire qui est ajouté pour informer le client du type de données réel de la valeur.

Par exemple, vous pouvez créer un tableau où chaque membre du tableau est un type MULTIPLE_PERSONALITY, comme suit.

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

Vous pouvez également utiliser le modèle précédent pour traiter les données instance suivantes, qui sont un tableau qui contient trois objets de personnalité multiples, chacun ayant une personnalité différente.

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

Ce traitement génère les instantané XML suivants.

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

Comme le montre l’instantané, l’analyseur a déterminé la personnalité correcte pour chacun des trois membres du tableau et a défini l’attribut de personnalité dans l’élément de chaque membre pour indiquer la personnalité appropriée.