Héritage XML par extension dans les documents de mappage
Cartographie des documents dans Mendix aidez à connecter votre Mendix applications vers d'autres systèmes tels que des services Web externes. Mendix 6.1 Les documents de cartographie ont été considérablement améliorés et vous pouvez en lire plus à ce sujet dans ce blog.
Dans les documents de mappage, vous définissez comment traduire entre Mendix objets et XML basés sur un schéma XML ou un document WSDL. De tels schémas peuvent contenir une relation d'héritage en définissant un complexType comme une extension d'un autre complexType. Nous appelons cela l'héritage XML et c'est le sujet de ce billet de blog.
Mendix L'héritage XML est partiellement pris en charge depuis longtemps, mais il est entièrement pris en charge depuis la version 6.1. Ceci est important car certaines normes largement utilisées utilisent l'héritage XML (par exemple, les normes de données électroniques ACORD pour l'échange électronique de données d'assurance entre partenaires commerciaux).
Désormais, nous vous demandons de mapper une structure d'héritage dans votre modèle de domaine similaire à celle définie dans le schéma XML. Vous devrez également décider quels sous-types vous souhaitez mapper. Grâce à ces modifications, nous pouvons désormais prendre en charge les listes mixtes d'un certain type parent dans les mappages d'importation et d'exportation. Dans cet article, j'explique comment utiliser la nouvelle fonctionnalité.
1. Exemple d'héritage XML
Dans cet article, j'utiliserai le schéma XML suivant comme exemple :
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<xsd:complexType name="PersonType" abstract="true">
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"/>
<xsd:element name="Address" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="CustomerType">
<xsd:complexContent>
<xsd:extension base="PersonType">
<xsd:sequence>
<xsd:element name="Company" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="EmployeeType">
<xsd:complexContent>
<xsd:extension base="PersonType">
<xsd:sequence>
<xsd:element name="Salary" type="xsd:int"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Person" type="PersonType" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Le schéma comporte un élément racine avec un élément appelé Person de type « PersonType » qui apparaît une ou plusieurs fois. « PersonType » est un type abstrait, ce qui signifie que les objets de type « PersonType » ne peuvent pas être créés. Il existe deux types étendant « PersonType » : « EmployeeType » et « CustomerType ». Ainsi, le XML valide selon ce schéma XML est une liste mixte de clients et d'employés avec au moins une entrée. Un exemple de XML avec 3 entrées : un employé, un client et un autre employé, est présenté ci-dessous :
<?xml version="1.0" encoding="UTF-8"?>
<root>
<Person xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="EmployeeType">
<Name>employee1</Name>
<Address>somewhere</Address>
<Salary>12</Salary>
</Person>
<Person xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="CustomerType">
<Name>customer1</Name>
<Address>somewhereElse</Address>
<Company>companyA</Company>
</Person>
<Person xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="EmployeeType">
<Name>employee2</Name>
<Address>somewhereElseAltogether</Address>
<Salary>12000000</Salary>
</Person>
</root>
Dans le XML, les employés et les clients sont dans des balises « Person » et spécifient le type en spécifiant l'attribut xsi:type. Ils ont les attributs name et address en commun et étendent cela avec le salaire et l'entreprise respectivement, comme spécifié dans le schéma XML.
2. Héritage XML dans l'écran de sélection des éléments
Si vous souhaitez effectuer un mappage pour un schéma XML dans Mendix, vous créez d'abord un document de schéma XML et importez le schéma XML. Ensuite, vous créez un document de mappage d'importation ou d'exportation et cliquez sur « sélectionner les éléments ». Ensuite, vous sélectionnez le schéma XML dans l'écran de sélection des éléments et vous verrez alors l'écran illustré à la figure 1.

Figure 1. Écran de sélection des éléments pour un mappage d'exportation avec notre exemple de schéma XML
Dans l'arborescence de sélection, nous voyons trois niveaux. Tout d'abord, il y a le niveau « racine ». Ensuite, il y a le niveau d'héritage qui représente l'élément avec le nom Person et le type « PersonType » dans le schéma XML. Au troisième niveau, tous les sous-types autorisés de « PersonType » sont affichés. Dans ce cas, cela signifie « CustomerType » et « EmployeeType ». Si « PersonType » n'avait pas été abstrait dans le schéma XML, il aurait également été disponible ici. Tous les types que vous cochez ici seront présents dans le document de mappage. Chaque type que vous incluez dans le mappage sera exporté ou importé (selon le type de document) lorsque le mappage est invoqué dans un microflow. Les objets d'un type que vous choisissez de ne pas sélectionner seront ignorés en silence. Ainsi, comme la sélection est maintenant effectuée, le mappage n'exportera que les personnes de type « CustomerType » et non de type « EmployeeType ». De même, si la sélection actuelle avait été effectuée pour un mappage d'importation, tous les objets du XML entrant de type « EmployeeType » auraient été ignorés par le mappage.
Dans la figure 1, vous pouvez également voir qu'un certain nombre d'éléments sont cochés et ne peuvent pas être décochés car les cases à cocher sont désactivées. Pour les nœuds racine et d'héritage, cela est vrai car ils sont obligatoires : ils doivent apparaître exactement une fois (racine) ou au moins une fois (héritage). Pour le 'CustomerType', c'est le cas car pour chaque nœud d'héritage sélectionné, au moins un nœud enfant doit être sélectionné. Lorsque vous sélectionnez également le nœud 'EmployeeType', il devient possible de décocher le 'CustomerType' (voir figure 2).

Figure 2. Écran Sélectionner les éléments : « EmployeeType » également sélectionné
3. Héritage XML dans les mappages d'exportation
Lorsque vous sélectionnez tous les éléments dans l'écran de sélection affiché dans la section précédente et appuyez sur « OK », vous voyez le document de mappage d'exportation affiché dans la figure 3.
Figure 3. Mappage d'exportation vide avec un élément d'héritage
Comment fonctionne un mappage d'exportation ? L'objectif d'un mappage d'exportation est de traduire un Mendix dans un document XML (ou une partie d'un document XML). Sur le côté droit de la figure 3, vous pouvez voir les éléments que vous avez sélectionnés dans l'écran de sélection des éléments. Il s'agit de la structure XML que nous voulons créer. Sur le côté gauche, vous devez spécifier les entités et les attributs qui doivent être utilisés pour créer cette structure XML et comment les obtenir. Vous pouvez choisir les entités en faisant glisser les entités (définies dans le modèle de domaine) sur les espaces réservés du menu du connecteur. Vous pouvez ensuite double-cliquer sur l'entité glissée, choisir d'obtenir l'objet par association ou par microflux et choisir les attributs à partir du menu Mendix les entités que vous avez fait glisser doivent être mappées à quels attributs dans les éléments XML. La configuration des mappages d'exportation est expliquée plus en détail dans chapitre 4 de ce billet de blog sur la cartographie des documents.
Pour montrer comment tout cela fonctionne pour les éléments de mappage d'héritage, je vais vous guider dans la réalisation du mappage d'exportation pour l'exemple. Tout d'abord, consultez la figure 4 pour le modèle de domaine que je vais utiliser. Dans la figure, vous pouvez voir une entité « Collection » avec une association 1..* à une entité « Personne ». L'entité « Personne » a deux attributs de chaîne : « nom » et « Adresse ». Enfin, il existe deux types d'entités qui utilisent « Personne » comme généralisation : « Employé » avec un attribut entier « Salaire » et « Client » avec un attribut de chaîne « Société ».
Figure 4. Modèle de domaine pour l'exemple
Nous allons maintenant connecter les entités de notre modèle de domaine aux éléments XML du mappage d'exportation. Le résultat final est présenté dans la figure 5 et je l'expliquerai ci-dessous.
Figure 5. Le mappage d'exportation terminé
Lorsque vous appelez un mappage d'exportation à partir d'un microflux, vous transmettez un Mendix objet à convertir en XML. Le type de cette entité doit être le même que celui de Mendix objet que vous choisissez de mapper à la racine du document de mappage. Nous y avons fait glisser l'entité « Collection », donc lorsque vous invoquez ce mappage, vous devez passer un Mendix Objet de type 'Collection'. Lorsque le mappage est invoqué, un élément XML appelé 'root' est créé. Le niveau suivant est l'élément d'héritage de type 'PersonType'. Nous avons fait glisser l'entité 'Person' ici. L'élément de mappage de niveau d'héritage est différent des éléments de mappage classiques car il ne crée pas d'élément XML (c'est pourquoi aucune flèche n'est dessinée pour ce niveau). Au lieu de cela, il est utilisé pour spécifier le type parent partagé pour tous les sous-types autorisés pour cet élément XML. Dans cet exemple, nous avons fait glisser l'entité 'Person' car il s'agit du parent des entités 'Employee' et 'Customer' que nous avons fait glisser en dessous pour faire un mappage vers les éléments XML 'CustomerType' et 'EmployeeType'.
Les éléments de mappage d'héritage se distinguent également des éléments de mappage classiques par le fait que vous configurez uniquement la manière d'obtenir l'objet. Dans l'exemple, nous obtenons l'objet via l'association « Person_Collection ». Nous avons configuré cela dans l'écran illustré à la figure 6 auquel vous accédez en double-cliquant sur l'élément de mappage d'héritage.
Figure 6. Obtention d'un objet pour un élément de mappage d'héritage
Nous ne mappons aucun attribut ici car l'élément de mappage de niveau d'héritage ne crée pas d'élément XML. Il sert uniquement à spécifier comment obtenir l'objet et le type parent pour tous les sous-types autorisés. Dans les éléments de mappage pour ces sous-types, c'est l'inverse. Vous n'avez pas à spécifier comment obtenir les objets car cela est déjà configuré dans l'élément de mappage de niveau d'héritage. Cependant, vous devez spécifier comment les attributs sont mappés car pour chaque objet de ce type, un élément XML réel est créé. Dans l'exemple, pour chaque « Client » de la collection, un élément XML « CustomerType » est créé avec les « Nom », « Adresse » et « Société » du « Client ». Mendix objet. Pour chaque « Employé », un élément XML « EmployeeType » est créé avec le « Nom », l'« Adresse » et le « Salaire » de l'« Employé » Mendix objet. Nous avons configuré cela dans l'écran illustré dans la figure 7 auquel vous accédez en double-cliquant sur l'élément de mappage « CustomerType ».
Figure 7. Mappage des attributs de l'élément XML « CustomerType »
4. Héritage XML dans les mappages d'importation
Lorsque vous sélectionnez tous les éléments de l’exemple de schéma XML pour un mappage d’importation, vous voyez le document de mappage d’importation illustré dans la figure 8.
Figure 8. Mappage d'importation vide avec un élément d'héritage
Le mappage d'importation ressemble au mappage d'exportation, mais il existe quelques différences importantes. D'une part, les flèches pointent de droite à gauche, ce qui indique que les éléments XML entrent dans le système et sont traduits en Mendix objets. De ce fait, la configuration est également différente des mappages d'exportation. Tout d'abord, j'ai de nouveau connecté les entités de notre modèle de domaine (voir figure 4) aux éléments XML du mappage d'importation. Le résultat final est présenté dans la figure 7 et je l'expliquerai ci-dessous.
Figure 9. Le mappage d'importation terminé
Alors, que fait un mappage d'importation ? Il prend les éléments XML entrants et les traduit en Mendix objets. Lorsqu'un élément XML arrive, il existe trois méthodes pour obtenir un objet : « créer un nouvel objet », « rechercher par clé » et « appeler un microflux ». Dans la figure 9, vous voyez « créer un nouvel objet » au-dessus de la flèche pour chacun des trois niveaux pour lesquels un Mendix l'objet doit être obtenu. Cela signifie que nous créons un nouvel objet vide Mendix objet avant de passer à l'étape suivante du mappage. Par la suite, les attributs sont mappés à l'objet obtenu Mendix objet tel que vous l'avez configuré dans le mappage (dans un écran similaire à la figure 7). Enfin, vous pouvez choisir de définir une association avec l'objet parent. La configuration des mappages d'importation est expliquée plus en détail dans chapitre 3 de ce billet de blog sur la cartographie des documents.
Tout comme pour les mappages d'exportation, l'élément de mappage de niveau d'héritage est différent des éléments de mappage classiques. Uniquement pour les enfants de l'élément de niveau d'héritage, nous devons spécifier comment obtenir un objet (« créer un nouvel objet », « rechercher par clé » ou « appeler un microflux ») et comment les attributs sont mappés de l'élément XML à l'élément Mendix objet. Ceci est visualisé dans la figure 9 en ne dessinant pas la flèche pour l'élément de niveau d'héritage. Si et quelle association doit être définie sur l'objet obtenu Mendix L'objet est cependant configuré dans l'élément de mappage d'héritage car les objets importés de type « Client » et « Employé » doivent se retrouver dans la même collection pour être conformes au schéma XML.
5. Héritage XML et utilisation de « Mappage automatique » pour remplir vos mappages
Lorsque vous créez un nouveau document de mappage, il peut être assez fastidieux de connecter initialement les éléments XML aux entités, associations et attributs. La fonction d'assistance Mapper automatiquement vous aidera à le faire en recherchant ou en créant des entités et des associations de modèle de domaine et en les ajoutant au mappage pour vous éviter de faire beaucoup de travail manuel. Cette fonction d'assistance fonctionne également avec l'héritage et créera la structure d'héritage requise dans le modèle de domaine. Notez que si vous avez un modèle de domaine existant partiel, il ne créera pas automatiquement de généralisations d'entités s'il y a un impact sur le comportement de persistance de l'entité. Il se peut donc qu'il reste du travail à faire après avoir utilisé la fonction « Mapper automatiquement ». Pour plus d'informations, consultez le Carte automatique rubrique dans la documentation.
6. Conversion d'anciens projets avec des schémas XML avec héritage XML
Dans cette section, je vais discuter de la façon dont vous pouvez mettre à niveau vos anciens projets avec l'héritage XML pour Mendix 6.1. Pour ce faire, je vais d'abord montrer à quoi pourraient ressembler le modèle de domaine (voir figure 10), le mappage d'exportation (voir figure 11) et le mappage d'exportation (voir figure 11) pour l'exemple de schéma XML Mendix 6.0 et versions antérieures.
Figure 10. Modèle de domaine pour un exemple de schéma XML dans Mendix 6.0
Figure 11. Mappage d'exportation pour un exemple de schéma XML dans Mendix 6.0
Figure 12. Mappage d'importation pour un exemple de schéma XML dans Mendix 6.0
Dans ces figures, vous remarquerez que l'entité de collection a deux associations distinctes avec « Client » et « Employé » (sans entité abstraite « Personne ») et que le niveau supplémentaire pour le niveau d'héritage n'est pas présent dans les mappages. Lorsque nous ouvrons ce projet dans Mendix 6.1 nous voyons les erreurs de cohérence montrées dans la figure 13.
Figure 13. Erreurs de cohérence après la mise à niveau du projet vers Mendix 6.1
Pour résoudre ces problèmes, cliquez d'abord avec le bouton droit de la souris sur les deux premières erreurs de cohérence, puis cliquez sur « Résoudre en mettant à jour à partir du schéma » pour réaligner les mappages avec le schéma XML. Cela mettra à jour le mappage d'importation pour qu'il ressemble à la figure 14, et le mappage d'exportation pour qu'il ressemble à la figure 15.
Figure 14. Mappage d'importation après mise à jour à partir du schéma
Figure 15. Exportation du mappage après mise à jour à partir du schéma
Les erreurs de cohérence restantes peuvent être résolues en procédant comme suit. Commencez par mettre à jour le modèle de domaine pour qu'il ressemble à la figure 4 en introduisant une entité de généralisation pour « Employé » et « Client » (« Personne ») avec une seule association avec « Collection ». Vous n'avez plus besoin des associations « Employee_Collection » et « Customer_Collection ». Gardez cependant à l'esprit que si vous avez des données existantes dans votre application et que vous souhaitez les conserver, vous devez migrer vos données lorsque vous apportez des modifications aux associations dans votre modèle de domaine. Enfin, faites glisser l'entité « Personne » vers l'espace réservé vide dans le mappage d'importation et d'exportation et les erreurs de cohérence devraient être résolues. Vous vous retrouverez avec des mappages comme dans les figures 5 et 9.
Dans les situations où vous n'avez sélectionné qu'un seul sous-type d'un élément d'héritage, il existe une astuce pour éviter les étapes ci-dessus pour modifier votre modèle de domaine. Si, par exemple, vous n'avez sélectionné que le « CustomerType » dans votre boîte de dialogue « Sélectionner les éléments », vous n'avez pas besoin de faire de généralisation (l'entité « Personne ») et vous pouvez également utiliser l'entité « Client » au niveau de l'héritage. Cela fonctionne parce qu'un « Client » est un « Client » et qu'aucun autre sous-type n'est sélectionné qui doit être une spécialisation du « Client ». Le mappage d'exportation créé ainsi est illustré dans la figure 16.
Figure 16. Exportation du mappage avec uniquement le « CustomerType » sélectionné













