Modéliser pour XML

Cette section explique comment modéliser les objets XML Schema dans le modèle orienté objet PowerAMC.

Objet XML

Modélisation dans PowerAMC

Schema

Tout package ou modèle permet de générer un XML-Schema. Il n'est pas utile de définir un attribut ou stéréotype spécifique pour le package ou modèle afin de générer un XML-Schema.

Type complexe (Complex type)

Dans XML-Schema, un type complexe permet aux éléments qu'il contient de porter des attributs. Les types complexes peuvent être :

  • Global, cela signifie qu'ils sont définis comme enfant de l'élément de schema, et ce afin d'être réutilisés dans les différents éléments de schema. Vous pouvez définir un type complexe global en utilisant une classe ayant le stéréotype <<complexType>>. Dans l'exemple suivant, UsAddress est un type complexe avec un jeu d'attributs qui le spécifient :

    <xsd:complexType name="UsAddress">
      <xsd:element name="name" type="Name"/>
      <xsd:element name="street" type="string"/>
      <xsd:element name="town" type="string"/>
      <xsd:element name="zip" type="Integer"/>
    </xsd:complexType>
  • Local pour un élément de définition. Dans ce cas, vous devez créer une classe avec le stéréotype <<element>>. Vous devez ensuite définir l'attribut étendu isComplexType de la classe à True, ceci afin de vous assurer que les attributs définis dans la classe <<element>> sont générés sous forme de type complexe :

    <xsd:element name="customer">
      <xsd:complexType>
      <xsd:element name="name" type="int"/>
      <xsd:element name="address" type="int"/>
      </xsd:complexType>
    </xsd:element>

Type simple (simple type)

Dans XML-Schema, un type simple (simple type) peut être une chaîne ou un nombre décimal construit dans XMLSchema, il peut également s'agir d'un type dérivé de ceux inclus au langage. Un type simple ne peut pas contenir d'élément ou d'attribut. Dans PowerAMC, vous concevez un type simple en créant une classe avec le stéréotype <<simpleType>>. Vous devez ajouter un attribut ayant le stéréotype <<simpleType>> à cette classe.

<xsd:simpleType name="string">
  <xsd:restriction base="string">
  </xsd:restriction>
</xsd:simpleType>

Dérivation de types

XML-Schema permet de dériver de nouveaux types en étendant ou en restreignant un type existant. Dans PowerAMC, vous concevez le mécanisme d'extension en utilisant une généralisation entre deux classes. L'attribut étendu contentDerivation de la généralisation permet de définir le type de dérivation : extension ou restriction.

Pour concevoir la dérivation de type à partir d'un type de base (défini dans Settings\DataTypes\BasicDataTypes dans l'éditeur de langage objet) vous ne pouvez pas utiliser les classes et généralisations, vous devez pour ce faire utiliser les attributs étendus simpleContentBase et simpleContentDerivation. Par exemple, classe A dérive du type de données de base xsd:string. Vous définissez cette dérivation en spécifiant les valeurs suivantes pour la classe A :

Union

Une classe <<union>> génère un attribut <<union>> et est migrée pour spécifier l'emplacement de l'attribut. Vous pouvez générer une balise <union> sur une seule ligne comme suit : <union memberTypes="{liste de types de membres}"/>. Vous pouvez définir une valeur pour l'attribut étendu memberTypes utilisé pour les attributs simples Type (<<simpleType>> ou <<simpleAttribute>>).

Elément global

Un élément global est déclaré comme enfant de l'élément de schema ; il peut être référencé dans une ou plusieurs déclarations. Vous définissez un élément global XML-Schema à l'aide d'une classe ayant le stéréotype <<element>> dans PowerAMC. Vous pouvez définir le type d'un élément global de l'une des façons suivantes :

  • Pour un type complexe, utilisez des attributs. Dans ce cas, vous devez définir l'attribut étendu isComplexType à True pour les attributs définis dans la classe <<element>> pour être généré comme type complexe :

    <xsd:element name="customer">  
    <xsd:complexType>
    <xsd:element name="name" type="int"/>
    <xsd:element name="address" type="int"/>
    </xsd:complexType>
    </xsd:element>
  • Pour un type simple, définissez une valeur pour l'attribut étendu type

    <xsd:element name="Customer" type="CustomerListType"/>

Groupe d'éléments

Un groupe d'éléments est déclaré comme enfant de l'élément de schema ; il peut être référencé dans une ou plusieurs déclarations en utilisant le stéréotype <<ref>> sur une association. Vous définissez un groupe d'éléments XML-Schema à l'aide d'une classe ayant le stéréotype <<group>> dans PowerAMC.

Groupe d'attributs

Un groupe d'attributs est un jeu d'attributs. Vous définissez un groupe d'attributs XML-Schema en utilisant une classe ayant le stéréotype <<attributeGroup>> dans PowerAMC. Tous les attributs de cette classe doivent avoir le stéréotype <<attribute>>. Par exemple, le groupe d'attributs suivant appelé item rassemble des informations relatives à un élément d'une commande :

<xsd:attributeGroup name="item">
<xsd:attribute name="weight" type="Integer"/>
<xsd:attribute name="shipping_method" type="Integer"/>
</xsd:attributeGroup>

Référence

Une référence est une déclaration simplifiée d'un groupe d'éléments ou d'attributs qui référencent une définition globale. Dans PowerAMC, vous concevez une référence à l'aide d'une association avec le stéréotype <<ref>>. Dans l'exemple suivant, l'élément Customer fait référence au type complexe UsAddress.

<xsd:element name="Customer">
<xsd:complexType>
<xsd:element name="name" type="int"/>
<xsd:element name="ID" type="int"/>
<xsd:complexType ref="UsAddress" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:complexType>
</xsd:element>

Remarquez que l'élément référencé est introduit par son stéréotype. Dans l'exemple ci-dessus, UsAddress est <<complexType>> et complexType s'affiche dans la ligne de la référence : <xsd:complexType ref="UsAddress" minOccurs="0" maxOccurs="unbounded"/>

Séquence

Les éléments XML-Schema peuvent être contraints de s'afficher dans l'ordre de déclaration, on parle alors de séquence. Dans PowerAMC, selon de type de séquence que vous devez concevoir, vous pouvez utiliser l'une des méthodes suivantes :

  • Si tous les attributs de classe sont définis dans la séquence, vous devez créer une classe dépourvue de stéréotype et définir l'attribut étendu de classe isSequence à true. Dans l'exemple suivant, tous les attributs de la classe item_sequence sont définis dans la séquence :

    <xsd:element name="item_sequence">
    <xsd:sequence>
    <xsd:element name="prodName" type="int"/>
    <xsd:element name="prodID" type="int"/>
    <xsd:element name="prodPrice" type="int"/>
    </xsd:sequence>
    </xsd:element>
  • Si certains des attributs de classe n'appartiennent pas à la séquence, vous devez procéder de la façon suivante : créer une classe contenant les attributs appartenant à la séquence et affecter le stéréotype <<sequence>> à cette classe, créer une autre classe contenant les autres attributs, sélectionner l'outil Lien interne dans la Boîte à outils puis tracer un lien de la seconde classe vers la classe <<sequence>>. Le code résultant se présente comme suit :

    <xsd:element name="PurchaseOrder">
    <xsd:sequence>
    <xsd:element name="shipTo" type="int"/>
    <xsd:element name="billTo" type="int"/>
    </xsd:sequence>
    <xsd:element name="prodID" type="int"/>
    </xsd:element>

Par défaut, les classes internes sont générées avant les attributs dans une classe (comme défini dans l'entrée Class \Template\body dans le fichier de définition du langage objet). Toutefois, vous pouvez modifier la génération des attributs de classe à l'aide de la fonctionnalité de migration d'attributs. Pour ce faire, vous devez créer une association de la classe parent vers la classe <<sequence>>, pointer sur l'association, cliquer le bouton droit de la souris, puis sélectionner Migrer > Migrer les rôles navigables. L'attribut migré peut ensuite être déplacé dans la liste des attributs de classe afin de respecter l'ordre de génération souhaité.

<xsd:element name="PurchaseOrder">
<xsd:element name="prodID" type="int"/>
<xsd:sequence>
<xsd:element name="shipTo" type="int"/>
<xsd:element name="billTo" type="int"/>
</xsd:sequence>
</xsd:element>

Choix et tout (Choice & All)

Un choix (choice) permet d'afficher uniquement un enfant dans une instance d'un élément. Tout (All) permet d'afficher tous les éléments à la fois dans le groupe, ou aucun. Dans PowerAMC, vous concevez un choix/tout presque comme une séquence.

  • Si tous les attributs de la classe sont définis dans le choix/tout, vous devez créer une classe dépourvue de stéréotype et définir l'attribut étendu isChoice/isAll de cette classe à true. Dans l'exemple suivant, tous les attributs de la classe InternationalShipping sont définis dans le choix :

    <xsd:element name="InternationalShipping">
    <xsd:choice>
    <xsd:element name="EuropeShipping" type="int"/>
    <xsd:element name="AfricaShipping" type="int"/>
    <xsd:element name="AsiaShipping" type="int"/>
    </xsd:choice>
    </xsd:element>
  • Si certains des attributs de classe n'appartiennent pas au choix, vous devez créer une classe contenant tous les attributs appartenant au choix et affecter le stéréotype <<choice>>/<<all>> à cette classe, créer une autre classe contenant les autres attributs, sélectionner l'outil Lien interne dans la Boîte à outils, puis tracer un lien entre la seconde classe et la classe <<choice>>>>/<<all>>. Vous pouvez également utiliser la fonctionnalité de migration d'attributs pour modifier l'ordre de génération entre attributs (voir Séquence, plus haut).