Partager via


Types de données de modèle composite

Un type de données COMPOSITE se compose d’une ou plusieurs valeurs qui ont le même type de données ou des types de données différents. Les composites peuvent avoir une longueur fixe ou variable (mais pas indéfinie). Ce type de données est similaire au type de données structure Language C.

*DataType : COMPOSITE indique à un modèle de définir un type de données composé dont les membres peuvent être de types de données différents. Les membres du type de données COMPOSITE sont générés en tant qu’éléments enfants XML individuels qui appartiennent à l’élément qui représente le contexte englobant. Si chaque élément enfant représente une primitive de type de données, le type de données est défini par l’attribut XML xsi:type dans chaque élément. Si un attribut GDL est défini comme DataType : COMPOSITE, le contexte englobant est l’élément <GDL_ATTRIBUTE> . Le nom de l’élément de chaque élément enfant XML est la balise correspondante définie par directive : *ElementTags.

Si composite est lui-même membre d’un autre type de données composé, un élément est créé pour représenter ce contexte englobant. Le nom de cet élément parent est la balise correspondante qui est affectée par le modèle qui correspond au type de données composé englobant.

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

  • *ElementType (obligatoire). Nom du modèle qui définit les types de données de chacun des éléments. Un type de données doit être spécifié pour chaque élément. Un ou plusieurs éléments peuvent avoir le même type de données. Le nombre d’ElementTypes fournis doit être égal à la valeur ArraySize ou Max spécifiée par *ArraySize .

  • *RequiredDelimiter (Obligatoire). Chaîne qui sépare syntaxiquement chaque élément COMPOSITE du suivant. Deux délimiteurs consécutifs seront interprétés comme un élément omis. Les délimiteurs ne sont pas nécessaires pour indiquer l’omission des éléments de fin.

    Vous devez être très prudent si vous utilisez des espaces blancs comme délimiteur ou dans le cadre de la chaîne de délimiteur. Par exemple, l’analyseur interprète les caractères d’espace superflus comme indiquant des éléments omis ; et étant donné que vous ne voyez peut-être pas d’espace blanc supplémentaire, des erreurs d’analyse étranges peuvent se produire. En outre, l’espace blanc excédentaire est régulièrement supprimé du fichier source et l’espace blanc est souvent ajouté au flux d’entrée à la suite du traitement du préprocesseur, de la macro et des commentaires. Ainsi, la chaîne réellement analysée peut avoir un nombre de caractères d’espace complètement différent de celui spécifié à l’origine. Vous ne devez pas utiliser de caractères de tabulation dans la chaîne de délimiteur requise, car ils sont régulièrement convertis en caractères d’espace pendant le traitement de l’entrée.

  • *OptionalDelimiter (Facultatif). Toute chaîne composée de caractères spécifiés dans *OptionalDelimiter qui apparaît en regard de la chaîne *RequiredDelimiter est considérée comme faisant partie du délimiteur.

  • *ElementTags (obligatoire). Le nombre de balises fournies doit être égal à la valeur ArraySize ou Max spécifiée par *ArraySize . Chaque membre sera marqué avec la balise correspondante. Ce balisage est utile si un ou plusieurs éléments sont omis. Lorsque des éléments COMPOSITE sont omis, la balise qui correspond à l’élément omis n’est pas utilisée. Pour éviter de confondre le client, n’utilisez pas GDL instantané des noms d’éléments réservés comme noms d’étiquettes. Ces noms réservés sont CONSTRUCT, ATTRIBUTE et Personality.

  • *ArraySize (facultatif). Si cette directive est omise, un COMPOSITE de taille fixe est supposé. La taille sera égale au nombre de noms de modèles dans *ElementType.

    Utilisez deux entiers pour spécifier la taille minimale et la taille maximale autorisée pour un COMPOSITE de taille variable. Notez que zéro est autorisé pour la taille minimale. Les types de données COMPOSITE de taille illimitée ne sont pas autorisés. Vous ne pouvez pas utiliser le caractère générique GPD (*) pour spécifier la taille ou la taille maximale.

  • *ArrayLabel (facultatif). Si cette directive est spécifiée, la liste des éléments COMPOSITE doit être placée entre parenthèses et précédée de l’étiquette *ArrayLabel . Si aucune étiquette n’est spécifiée dans cette directive, les parenthèses sont facultatives et aucune étiquette de préfaçage n’est autorisée.

Considérez le modèle suivant.

*Template:  QUALNAME_EX
{
    *Type:  DATATYPE
    *DataType:   COMPOSITE
    *ElementType: (SYMBOL, SYMBOL, INTEGER)
    *RequiredDelimiter: "."
    *ElementTags: (feature, option, resourceID)
}

Le modèle précédent définit un composite de taille fixe composé de deux types de données SYMBOL et d’un entier. L’élément COMPOSITE n’est pas étiqueté. Chaque élément du COMPOSITE se voit attribuer un ÉlémentTag unique. Ces balises étiquetent chaque élément dans la sortie XML pour aider le client. Chaque élément est séparé du suivant par exactement un point (.) ; aucun autre caractère n’est considéré comme faisant partie du délimiteur. *ArraySize n’étant pas spécifié, une taille COMPOSITE fixe est supposée. Étant donné que la taille COMPOSITE est fixe, aucune omission de membre n’est autorisée.

*DataType : les modèles COMPOSITES ne génèrent pas de schéma correspondant. Le schéma des modèles nommés dans la directive *ElementType est utilisé à la place.

Par exemple, considérez un modèle SYMBOL qui est défini comme suit.

*Template:  SYMBOL
{
    *Type:  DATATYPE
    *DataType:   FILTER_TYPE
    *ElementType:  XML_STRING
    *FilterTypeName: "SYMBOLNAME"
}

Considérez également l’entrée GDL suivante.

*rcNameID:     ( RESDLL.stdname.467 )  

Ou considérez l’entrée GDL suivante qui n’a pas de parenthèses facultatives.

*rcNameID:     RESDLL.stdname.467

Supposons que l’entrée GDL soit interprétée à l’aide du modèle de RC_NAME_ID suivant.

*Template:  RC_NAME_ID
{
    *Name:  "*rcNameID"
    *Type:  ATTRIBUTE
    *ValueType:  QUALNAME_EX
    *Additive: LEAST_TO_MOST_RECENT
}

La sortie XML résultante sera la suivante.

    <GDL_ATTRIBUTE Name="*rcNameID"  >
        <feature  xsi:type="GDLW_string">RESDLL</feature>
        <option  xsi:type="GDLW_string">stdname</option>
        <resourceID  xsi:type="GDLW_int">467</resourceID>
    </GDL_ATTRIBUTE>

L’exemple suivant montre des types de données composés imbriqués à l’aide d’un type de données INTERVAL qui contient une paire de types de données DATE, qui représentent un intervalle de temps. Chaque type de données DATE est un COMPOSITE d’un type de données MONTH, DAY et YEAR. Le type de données INTERVAL est utilisé par l’attribut GDL VACATION pour exprimer une période pendant laquelle un employé peut être absent. La collection de modèles suivante permet de réaliser cette situation.

Modèle de mois

*Template:  MONTHS
{
    *Type:  DATATYPE
    *DataType:   ENUMERATOR
    *XMLDataType: "months"
    *EnumeratorList: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
}

Modèle day

*Template:  DAY
{
*Inherits: INTEGER
*MinValue: 1
*MaxValue: 31
}

Modèle d’année

*Template:  YEAR
{
*Inherits: INTEGER
*MinValue: 1900
*MaxValue: 2100
}

Modèle de date

*Template:  DATE
{
    *Type:  DATATYPE
    *DataType:   COMPOSITE
    *ElementType: (MONTHS, DAY, YEAR)
    *RequiredDelimiter: "-"
    *ElementTags: (month, day, year)
}

Modèle d’intervalle

*Template:  INTERVAL
{
    *Type:  DATATYPE
    *DataType:   ARRAY
    *ElementType:  DATE
    *RequiredDelimiter: "to"
    *OptionalDelimiter: "<20 09>"
    *ElementTags: (start_date, end_date)
    *ArraySize: 2
}

Modèle de vacances

*Template:  VACATION
{
    *Name:  "*VacationDates"
    *Type:  ATTRIBUTE
    *ValueType:  INTERVAL
}

Considérez l’entrée GDL suivante.

*VacationDates:  Dec-20-2001 to Jan-3-2002

Si cette entrée GDL est interprétée à l’aide du modèle VACATION, la sortie XML résultante est la suivante.

    <GDL_ATTRIBUTE Name="*VacationDates"  >
        <start_date >
            <month  xsi:type="GDLW_months">Dec</month>
            <day  xsi:type="GDLW_int">20</day>
            <year  xsi:type="GDLW_int">2001</year>
        </start_date>
        <end_date >
            <month  xsi:type="GDLW_months">Jan</month>
            <day  xsi:type="GDLW_int">3</day>
            <year  xsi:type="GDLW_int">2002</year>
        </end_date>
    </GDL_ATTRIBUTE>