1. 現状と限界
統合するために Mendix アプリケーションを外部の世界と連携させるには、XML文書をインポートして Mendix 文書に含まれる情報に基づいてオブジェクトを分類します。これには2つのものが必要です。まず、XMLデータの外観を記述し、その中に記述されているオブジェクトを認識できるようにするXMLスキーマ文書(XSDファイル)。次に、これらのXMLオブジェクトを Mendix オブジェクトが必要です。 Mendix プラットフォームは、この変換を XML からドメインへのマッピング ドキュメントで説明しており、そのドキュメントがこの記事の主なトピックです。このドキュメントでは、ユーザーは以下を構成する必要があります。
- この試験は Mendix オブジェクトを作成する必要がある
- これらのオブジェクトを互いにどのように関連付けるか
- これらのエンティティの属性をどのように入力する必要があるか
最後に、この文書を作成するユーザーを支援するために、 Mendix XML スキーマで定義された要素に基づいてエンティティを自動的に作成します。
上記の状況の実装における主な制限はバージョン 5.14 で解決されており、この記事で説明します。これらの制限は次のとおりです。
- 選択肢の代替案は、選択肢を参照するエンティティの個別の関連付けとして取得されました。
- 選択要素の多重度が失われました (XML スキーマでリストが定義されている場合でも、すべての異なる選択オプションの多重度は 1 でした)
- 選択要素はマッピングに明示的に表示されず、透過的ではありませんでした。
- マッピング用のエンティティを自動的に生成する場合、既存のエンティティは再利用されません。
この記事の残りの部分では、上記の問題がどのように解決されたかを説明します。したがって、この記事の対象は Mendix この章は、XMLからドメインへのマッピングを一般的に利用する開発者や、特に選択要素を含むXMLスキーマ文書を利用する人々を対象としています。まず、第2章で新しい機能を説明するために、選択要素を含むXMLスキーマの明示的な例を紹介します。続いて、第3章で、この例を実際に動作させて、その制限を説明します。 Mendix 次に、セクション 5.14 で同じ例を使用して、バージョン 4 でこの問題がどのように修正されたかを説明します。最後に、セクション 5.14 では、マイクロフロー内の新しい XML からドメインへのマッピングでより豊富な型情報を利用することで、変更の価値をさらに説明します。
2. 例: 人
次の XML スキーマを検討します。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="https://www.w3.org/2001/XMLSchema" >
<xs:complexType name="employee">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="salary" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="customer">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="company" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="persons">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="employee" type="employee"/>
<xs:element name="customer" type="customer"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
このスキーマは要素「persons」を定義します。これには、各「person」を反映する選択要素のリストが含まれます (minOccurs=”0”、maxOccurs=”unbounded”)。このリストの各エントリは、「従業員」または「顧客」のいずれかです (両方ではありません)。
これは有効な XML メッセージの例です。
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<employee>
<firstname>Piet </firstname>
<lastname>Pieters</lastname>
<salary>5</salary>
</employee>
<customer>
<firstname>Customer</firstname>
<lastname>Klant</lastname>
<company>Company</company>
</customer>
<employee>
<firstname>Other</firstname>
<lastname>Guy</lastname>
<salary>50</salary>
</employee>
</persons>
ここで、人物リストには、従業員、顧客、および別の従業員の 3 つのエントリが含まれています。
3. 現在の状況における人物の例
このセクションでは、現在の状況でこの XML スキーマに基づいて XML からドメインへのマッピングを作成する方法を示します。まず、新しい XML スキーマ ドキュメントを作成し、セクション 2 で定義した XML スキーマを選択します。次に、新しい XML からドメインへのマッピングを作成し、[要素の選択] をクリックして、表示されるポップアップで、スキーマ ソースとして作成した XML スキーマを選択します。1結果の画面は図 1 に表示されています。この図では、choice 要素がスキーマ要素ツリーに表示されておらず、その 0-* 多重度も欠落していることがわかります。

図 1. バージョン 5.14 より前の XML からドメインへのマッピングに含める XSD 要素の選択
すべての要素を選択して [OK] をクリックすると、マッピングの左側が埋められます。その後、[マッピングの生成] をクリックすると、関連付けられたエンティティ、属性、および関連付けが作成され (ドメイン モデル内、図 2 を参照)、XML からドメインへのマッピングの右側に埋められます。結果は図 3 に示されています。この図では、左側に選択オプションが実際に欠落していることがわかります。これの主な結果は、XML スキーマ ドキュメントの定義から予想されるように、persons には従業員と顧客の両方 (混在) を含むリストとの 1 つの関連付けがなく、従業員と顧客への 1:XNUMX の関連付けが XNUMX つあることです。これは本質的に異なるものであり、顧客/従業員のリストがインポートされると、最初のリストのみが実際にマッピングされるため、データ損失につながる可能性があります。 Mendix オブジェクト。これはバージョン5.14で解決されました。 Mendix 次のセクションで説明するように、プラットフォームです。

図 2. バージョン 5.14 より前の persons の例に対して自動的に生成されたドメイン モデル

図 3. バージョン 5.14 より前の persons の例における XML からドメインへのマッピングの構成
4. 人物の例を新しい状況に適応させる
このセクションでは、前のセクションで説明した状況がどのように解決されるかを示します。まず、前の状況から始めて、プロジェクトを変換するために必要な手順を説明し、結果として生じる変更を反映します。これは、ユーザーがアップグレードしやすくするためです。もちろん、新しい状況で新しいプロジェクトを最初から開始することは完全に可能です。これを行うには、セクション 3 で説明したのと同じ手順に従い、このセクションで説明する追加の手順で拡張するだけです。
セクション3で作成したプロジェクトをバージョン5.14で開くと、 Mendix プロジェクトを変換するには、プラットフォームの手動手順が必要です。エラー ウィンドウに次のエラー メッセージが表示されます。 「マッピング要素は選択肢のオプションです。スキーマ要素を再選択し、選択要素を含めてください」メッセージをダブルクリックすると、XML からドメインへのドキュメントが開き、関連する要素が選択されます (図 4 を参照)。

図4. 変換後、プロジェクトを変換するには手動の手順が必要です
メッセージに書かれているように、一貫性エラーを解決するにはスキーマ要素を再選択する必要があります。これを行うには、 「要素を選択…」 図 5 に示すダイアログが表示されます。

図5. 変換後のスキーマ要素の再選択
スキーマ要素ツリーでは、XML選択要素の明示的な要素があることがわかります。 "(選択)"この要素の多重度が正しく 0..* に設定されていることに注意してください。このウィンドウを開くと選択要素が自動的に選択されるので、[OK] をクリックして設定を保存し、マッピングの構成を続行します。
図 6 からわかるように、 "(選択)" マッピング要素がインポート マッピング ドキュメントに挿入されました。この追加のマッピング要素の意味は次のとおりです。選択肢のすべての代替物 (この場合は従業員と顧客) は、何かの代替物であるため、共通点を持つ必要があります。この場合、それらの共通点は、両方とも人物であることです。したがって、新しい状況では、選択肢のすべての代替物は、より一般的なエンティティ (人物) から継承する必要があり、そのエンティティはマッピングにドラッグする必要があります。この意味を実際に理解することが重要です。例では、人物エンティティに人物タイプのリストがあり、従業員と顧客はリストに表示できる特定のタイプの人物であることを意味します。
図 6 には、一貫性エラーが XNUMX つあります。最初の XNUMX つは、従業員と顧客の正しい一般化エンティティを選択することで解決されます。下の XNUMX つは、元の状況 (明示的な選択要素なし) では、選択肢自体 (従業員と顧客) がマッピング内の人物と関連付けられていたことに関係しています。これは選択要素で構成する必要があるため、許可されなくなりました。これを解決するには、従業員と顧客をダブルクリックします。関連付けが削除されることを説明するメッセージが表示されます。[OK] をクリックして確認します。

図6. 新しい(選択)要素を選択した後のXMLからドメインへのマッピング文書
最初の 7 つの一貫性エラーを解決するには、従業員と顧客の一般化クラスを手動で作成し、マッピング ドキュメントでこれを選択する必要があります。別の方法としては、[自動的にマップ] ボタンを使用してこれを実行することもできます。このボタンをクリックすると、図 XNUMX に示すようなメッセージが示され、実行された内容が説明されます。

図7. マッピング、エンティティ、関連付け、属性を自動生成する際の変更の概要
ここでは、マッピング内のエンティティと関連付けのほとんどが以前の状況から保持されていることがわかります。選択要素には、ChoiceBaseと呼ばれるクラスが作成され、従業員と顧客はこのクラスの特殊化になり、ChoiceBaseは個人エンティティに関連付けられています。これは、 「自動的にマップします...」 以前のバージョンでは、関数は実行されるたびにすべてのエンティティ、属性、関連付けを再作成していたため、エンティティ、属性、関連付けが作成され、その結果、不要になったエンティティで満たされたドメイン モデルが拡大し続けることになりました。
結果として得られるドメイン モデルを図 8 に示します。

図8. 人物の例に対して自動的に生成されたドメインモデル
この自動生成されたモデルにいくつかの改良を加えることができることに注意してください。まず、ChoiceBaseは非常に一般的な用語ですが、実際にドメインモデルを理解しているため、より具体的にすることができます。たとえば、エンティティの名前を次のように変更できます。 "人". そうするなら、 「ChoiceBase_persons」 関連付けを行います。これに続いて、 "ファーストネーム" の三脚と "苗字" 両方の特殊化にこれらの属性が含まれているため、従業員エンティティと顧客エンティティからこの人物エンティティに属性を追加します。最後に、従業員と人物、顧客と人物の間の関連付けを削除します。これは、人物エンティティの導入により、これらの関連付けは不要になったためです。これは、これらの関連付けが人物との関連付けを人物エンティティから継承するためです。これらすべての変更を行った後、ドメイン モデルは図 9 に示すようなものになります。

図9. 人物の例の自動生成されたドメインモデルの手動による改善
これらの変更を行った結果、XMLからドメインへのマッピングに4つの新しい一貫性エラーが発生していることがわかりました。これらの一貫性エラーは、 "ファーストネーム" の三脚と "苗字" 属性を特殊化エンティティ(従業員と顧客)から一般化エンティティ(人物)にマッピングし直す必要があります。手動で再マッピングするには、XMLからドメインへのマッピングに移動し、顧客と従業員の両方をダブルクリックして、属性を手動でマッピングするか、 「名前で属性をマップする」 ボタンをクリックします。これにより、すべての一貫性エラーが解決され、XML からドメインへのマッピング ドキュメントは図 10 のようになります。

図 10. persons の例の XML からドメインへのマッピング ドキュメントの最終バージョン
5. 新しいXMLからドメインへのマッピングの使用
前のセクションでは、選択要素を含む XML スキーマの XML からドメインへのマッピングを作成して構成する方法について説明しました。この記事の最後に、このマッピングをマイクロフローで使用する方法の例を示します。この例では、インポートされた XML ファイル内のすべての従業員の給与の合計を計算しますが、顧客 (給与が定義されていない顧客) は無視します。
これを実現するために、図11に示すマイクロフローを作成します。これは次のように行います。まず、入力パラメータとしてFiledocumentを選択します。次に、 「XML文書をインポート」 アクションでは、入力としてFiledocumentを選択し、マッピングとして定義したXML-to-Domainマッピングを選択し、出力をpersons変数に保存するように選択します。その後、取得アクションをドラッグして、personListを取得します。 「Person_persons」 persons 変数の関連付け。この後、すべての給与の合計を格納する変数を作成し、それをゼロに初期化します。次に、 personList 内のすべての項目を反復処理し、項目が Person のどの特定のサブタイプであるかに基づいて異なるアクションを実行します (継承分割を使用)。 Person が従業員の場合は、それを従業員にキャストし、その給与を合計に追加します。 Person が顧客の場合は、代わりにそれを無視します。すべての項目を反復処理した後、すべての給与の合計をログに書き込みます。
図 11. XML からドメインへのマッピングを使用して、人物の例で XML ファイル内のすべての顧客の給与を合計するマイクロフロー
謝辞
この記事は、Pieter van Balen と Kevin Dullemond の共著です。