マッピング ドキュメントにおける拡張による XML 継承
マッピング文書 Mendix あなたの接続を助けます Mendix 外部ウェブサービスなどの他のシステムへのアプリの連携。 Mendix 6.1のマッピングドキュメントは大幅に改善されており、これについては以下で読むことができます。 このブログ記事.
マッピングドキュメントでは、 Mendix オブジェクトと XML は、XML スキーマまたは WSDL ドキュメントに基づいています。このようなスキーマには、complexType を別の complexType の拡張として定義することで継承関係を含めることができます。これを XML 継承と呼び、これがこのブログ投稿のトピックです。
Mendix は長い間、XML 継承を部分的にサポートしてきましたが、バージョン 6.1 では完全にサポートされています。これは、広く使用されている標準の一部が XML 継承を使用しているため重要です (たとえば、取引パートナー間で保険データを電子的に交換するための ACORD 電子データ標準)。
今後は、XML スキーマで定義されているのと同様の継承構造をドメイン モデルにマッピングする必要があります。また、マッピングするサブタイプを決定する必要もあります。これらの変更により、インポートおよびエクスポート マッピングで特定の親タイプの混合リストをサポートできるようになりました。この記事では、新しい機能の利用方法について説明します。
1. XML継承の例
この記事では、次の XML スキーマを例として使用します。
<?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>
スキーマには、3 回以上出現するタイプ 'PersonType' の Person と呼ばれる XNUMX つの要素を持つルート要素があります。'PersonType' は抽象型であるため、タイプ 'PersonType' のオブジェクトは作成できません。'PersonType' を拡張するタイプには、'EmployeeType' と 'CustomerType' の XNUMX つがあります。したがって、この XML スキーマに従って有効な XML は、少なくとも XNUMX つのエントリを持つ顧客と従業員の混合リストです。従業員、顧客、および別の従業員の XNUMX つのエントリを持つ XML の例を以下に示します。
<?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>
XML では、従業員と顧客は「Person」タグ内にあり、xsi:type 属性を指定してタイプを指定します。これらには共通の名前属性と住所属性があり、XML スキーマで指定されているように、それぞれ給与と会社でこれを拡張します。
2. 要素選択画面でのXML継承
XMLスキーマのマッピングを作成したい場合は、 Mendixまず、XML スキーマ ドキュメントを作成し、XML スキーマをインポートします。次に、インポートまたはエクスポート マッピング ドキュメントを作成し、「要素の選択」をクリックします。その後、要素の選択画面で XML スキーマを選択すると、図 1 に示す画面が表示されます。

図 1. サンプル XML スキーマを使用したエクスポート マッピングの要素選択画面
選択ツリーには 3 つのレベルがあります。まず、「ルート」レベルがあります。次に、XML スキーマで名前が Person でタイプが「PersonType」である要素を表す継承レベルがあります。3 番目のレベルには、「PersonType」の許可されたすべてのサブタイプが表示されます。この場合、「CustomerType」と「EmployeeType」を意味します。「PersonType」が XML スキーマで抽象でない場合は、ここでも使用できます。ここでチェックしたすべてのタイプは、マッピング ドキュメントに存在します。マッピングに含める各タイプは、マイクロフローでマッピングが呼び出されたときにエクスポートまたはインポートされます (ドキュメント タイプによって異なります)。選択しないことにしたタイプのオブジェクトは、暗黙的に無視されます。したがって、現在の選択では、マッピングはタイプ「CustomerType」の人物のみをエクスポートし、「EmployeeType」の人物はエクスポートしません。同様に、現在の選択がインポート マッピングに対して行われた場合、受信 XML 内の 'EmployeeType' タイプのすべてのオブジェクトがマッピングによって無視されます。
図 1 では、いくつかの要素がチェックされており、チェックボックスが無効になっているため、チェックを外すことができないこともわかります。ルート ノードと継承ノードの場合、これは必須であるため当てはまります。つまり、これらは 2 回だけ (ルート) または少なくとも XNUMX 回 (継承) 出現する必要があります。'CustomerType' の場合、これは、選択された継承ノードごとに少なくとも XNUMX つの子ノードを選択する必要があるためです。'EmployeeType' ノードも選択すると、'CustomerType' のチェックを外すことができます (図 XNUMX を参照)。

図 2. 要素の選択画面: 「EmployeeType」も選択されています
3. エクスポートマッピングにおけるXML継承
前のセクションで示した選択画面ですべての要素を選択し、「OK」を押すと、図 3 に示すエクスポート マッピング ドキュメントが表示されます。
図3. 継承要素を持つ空のエクスポートマッピング
エクスポートマッピングはどのように機能しますか?エクスポートマッピングの目的は、 Mendix オブジェクトをXML文書(またはXML文書の一部)にインポートします。図3の右側には、要素の選択画面で選択した要素が表示されています。これが作成するXML構造です。左側では、そのXML構造を作成するために使用するエンティティと属性、およびそれらの取得方法を指定する必要があります。エンティティを選択するには、コネクタメニューからエンティティ(ドメインモデルで定義)をプレースホルダーにドラッグします。その後、ドラッグしたエンティティをダブルクリックし、関連付けまたはマイクロフローによってオブジェクトを取得することを選択し、 Mendix ドラッグしたエンティティは、XML要素のどの属性にマッピングされる必要がありますか。エクスポートマッピングの設定方法については、 マッピングドキュメントに関するこのブログ投稿の第4章.
継承マッピング要素でこれがどのように機能するかを示すために、例のエクスポート マッピングを完了する手順を説明します。まず、使用するドメイン モデルについては、図 4 を参照してください。図では、'Collection' エンティティと 'Person' エンティティとの 1..* の関連付けを確認できます。'Person' エンティティには、'name' と 'Address' という XNUMX つの文字列属性があります。最後に、'Person' を一般化として使用する XNUMX つのエンティティ タイプがあります。整数属性 'Salary' を持つ 'Employee' と、文字列属性 'Company' を持つ 'Customer' です。
図4. 例のドメインモデル
ここで、ドメイン モデル内のエンティティをエクスポート マッピング内の XML 要素に接続します。最終結果は図 5 に示されており、以下で説明します。
図5. 完成したエクスポートマッピング
マイクロフローからエクスポートマッピングを呼び出すときは、 Mendix XMLに変換するオブジェクト。このエンティティの型は、 Mendix マッピングドキュメントのルートにマップするオブジェクトを選択します。ここでは「コレクション」エンティティをドラッグしたので、このマッピングを呼び出すときは、 Mendix タイプ 'Collection' のオブジェクト。マッピングが呼び出されると、'root' という XML 要素が作成されます。次のレベルは、タイプ 'PersonType' の継承要素です。ここでは 'Person' エンティティをドラッグしました。継承レベルのマッピング要素は、XML 要素を作成しないため、通常のマッピング要素とは異なります (このレベルに矢印が描画されていないのはそのためです)。代わりに、この XML 要素のすべての許可されたサブタイプに共有される親タイプを指定するために使用されます。この例では、'Person' エンティティをドラッグしました。これは、その下にドラッグした 'Employee' エンティティと 'Customer' エンティティの親であり、'CustomerType' および 'EmployeeType' XML 要素にマップするためです。
継承マッピング要素が通常のマッピング要素と異なる点は、オブジェクトの取得方法のみを構成することです。例では、「Person_Collection」関連付けを通じてオブジェクトを取得します。継承マッピング要素をダブルクリックすると表示される図 6 の画面でこれを構成しました。
図6. 継承マッピング要素のオブジェクトの取得
継承レベルのマッピング要素は XML 要素を作成しないため、ここでは属性をマッピングしません。これは、許可されているすべてのサブタイプのオブジェクトと親タイプを取得する方法を指定するためだけに存在します。これらのサブタイプのマッピング要素では、その逆になります。継承レベルのマッピング要素で既に構成されているため、オブジェクトの取得方法を指定する必要はありません。ただし、そのタイプの各オブジェクトに対して実際の XML 要素が作成されるため、属性のマッピング方法を指定する必要があります。例では、コレクション内のすべての「顧客」に対して、「顧客」の「名前」、「住所」、および「会社」を含む「顧客タイプ」XML 要素が作成されます。 Mendix オブジェクト。各「従業員」に対して、「従業員」の「名前」、「住所」、「給与」を含む「従業員タイプ」XML要素が作成されます。 Mendix オブジェクト。これは、「CustomerType」マッピング要素をダブルクリックすると表示される図 7 の画面で設定しました。
図7. 「CustomerType」XML要素の属性のマッピング
4. インポートマッピングにおけるXML継承
インポート マッピングの例の XML スキーマからすべての要素を選択すると、図 8 に示すインポート マッピング ドキュメントが表示されます。
図 8. 継承要素を持つ空のインポート マッピング
インポートマッピングはエクスポートマッピングに似ていますが、いくつか重要な違いがあります。まず、矢印が右から左を指し、XML要素がシステムに入力され、 Mendix オブジェクトです。このため、構成もエクスポート マッピングとは異なります。まず、ドメイン モデル内のエンティティ (図 4 を参照) をインポート マッピング内の XML 要素に再度接続しました。最終結果は図 7 に示されており、以下で説明します。
図9. 完成したインポートマッピング
では、インポートマッピングは何をするのか?それは、入力されたXML要素を Mendix オブジェクト。XML要素がやってくると、オブジェクトを取得するには「新しいオブジェクトの作成」、「キーによる検索」、「マイクロフローの呼び出し」の9つの方法があります。図XNUMXでは、オブジェクトが取得されるXNUMXつのレベルごとに矢印の上に「新しいオブジェクトの作成」が表示されています。 Mendix オブジェクトを取得する必要があります。つまり、新しい空のオブジェクトを作成します。 Mendix マッピングの次のステップに進む前に、オブジェクトをマッピングします。その後、属性は取得されたオブジェクトにマッピングされます。 Mendix マッピングで設定した方法でオブジェクトをインポートします(図7のような画面)。最後に、親オブジェクトへの関連付けを設定できます。インポートマッピングの設定方法については、 マッピングドキュメントに関するこのブログ投稿の第3章.
エクスポートマッピングと同様に、継承レベルマッピング要素は通常のマッピング要素とは異なります。継承レベル要素の子に対してのみ、オブジェクトの取得方法(「新しいオブジェクトの作成」、「キーによる検索」、または「マイクロフローの呼び出し」)と、属性がXML要素から Mendix オブジェクト。これは、図9では継承レベル要素の矢印を描いていないことで視覚化されています。取得されたオブジェクトに関連付けを設定する必要があるかどうか、またどのような関連付けを設定する必要があるかは、 Mendix ただし、インポートされたオブジェクトの種類「Customer」と「Employee」は、XML スキーマに準拠するために同じコレクションに含まれる必要があるため、継承マッピング要素でオブジェクトが構成されます。
5. XML継承と「自動マップ」を使用してマッピングを埋める
新しいマッピング ドキュメントを作成する場合、最初に XML 要素をエンティティ、関連付け、および属性に接続するのは非常に面倒です。自動マップ ヘルパー関数は、ドメイン モデルのエンティティと関連付けを検索または作成し、マッピングに追加することで、多くの手作業から解放します。このヘルパー関数は継承にも機能し、ドメイン モデルに必要な継承構造を作成します。既存のドメイン モデルが部分的に存在する場合、エンティティの永続動作に影響がある場合、エンティティの一般化は自動的に作成されないことに注意してください。そのため、「自動マップ」機能を使用した後も、作業が残っている可能性があります。詳細については、 自動的にマップする ドキュメントのセクション。
6. XML継承によるXMLスキーマを持つ古いプロジェクトの変換
このセクションでは、XML継承を使用して古いプロジェクトをアップグレードする方法について説明します。 Mendix 6.1. まず、ドメインモデル(図10参照)、エクスポートマッピング(図11参照)、エクスポートマッピング(図11参照)の例を、次の図に示します。 Mendix 6.0 以前のバージョン。
図10. XMLスキーマの例のドメインモデル Mendix 6.0
図11. XMLスキーマ例のエクスポートマッピング Mendix 6.0
図12. XMLスキーマ例のインポートマッピング Mendix 6.0
これらの図では、コレクションエンティティが「顧客」と「従業員」(抽象的な「人」エンティティなし)との2つの個別の関連付けを持ち、継承レベルの追加レベルがマッピングに存在しないことがわかります。このプロジェクトを Mendix 6.1 図13に示す一貫性エラーが表示されます。
図13. プロジェクトをアップグレードした後の一貫性エラー Mendix 6.1
これらを解決するには、まず最初の 14 つの一貫性エラーを右クリックし、「スキーマから更新して解決」をクリックして、マッピングを XML スキーマに再調整します。これにより、インポート マッピングが図 15 のように更新され、エクスポート マッピングが図 XNUMX のように更新されます。
図 14. スキーマから更新した後のインポート マッピング
図 15. スキーマから更新した後のエクスポート マッピング
残っている一貫性エラーは、次の手順で解決できます。まず、'Collection' との単一の関連付けを持つ 'Employee' と 'Customer' ('Person') の一般化エンティティを導入して、ドメイン モデルを図 4 のように更新します。'Employee_Collection' と 'Customer_Collection' の関連付けは不要になります。ただし、アプリに既存のデータがあり、それを保持したい場合は、ドメイン モデルの関連付けを変更するときにデータを移行する必要があることに注意してください。最後に、'Person' エンティティをインポート マッピングとエクスポート マッピングの両方の空のプレースホルダーにドラッグすると、一貫性エラーが解決されます。最終的には、図 5 と 9 のようなマッピングになります。
継承要素のサブタイプを 16 つだけ選択している場合、上記の手順を回避してドメイン モデルを変更する方法があります。たとえば、[要素の選択] ダイアログで [CustomerType] のみを選択した場合は、一般化 ([Person] エンティティ) を行う必要はなく、代わりに継承レベルで [Customer] エンティティを使用することもできます。これが機能するのは、[Customer] が [Customer] であり、[Customer] の特殊化である必要のある他のサブタイプが選択されていないためです。このようにして作成されたエクスポート マッピングを図 XNUMX に示します。
図16. 「CustomerType」のみを選択したエクスポートマッピング













