XML-Vererbung durch Erweiterung in Mapping-Dokumenten
Mapping von Dokumenten in Mendix helfen Ihnen beim Verbinden Ihrer Mendix Apps an andere Systeme wie externe Webdienste. In Mendix 6.1 Mapping-Dokumente wurden erheblich verbessert. Weitere Informationen hierzu finden Sie in diesem Blog-Post.
In Mapping-Dokumenten definieren Sie, wie zwischen Mendix Objekte und XML basierend auf einem XML-Schema oder WSDL-Dokument. Solche Schemata können eine Vererbungsbeziehung enthalten, indem ein complexType als Erweiterung eines anderen complexType definiert wird. Wir nennen dies XML-Vererbung und dies ist das Thema dieses Blogbeitrags.
Mendix XML-Vererbung wird seit langem teilweise unterstützt, ab Version 6.1 ist sie jedoch vollständig. Dies ist wichtig, da einige weit verbreitete Standards XML-Vererbung verwenden (z. B. die ACORD-Datenstandards für den elektronischen Austausch von Versicherungsdaten zwischen Handelspartnern).
Von nun an müssen Sie in Ihrem Domänenmodell eine Vererbungsstruktur verwenden, die der im XML-Schema definierten ähnelt. Sie müssen auch entscheiden, welche Untertypen Sie zuordnen möchten. Aufgrund dieser Änderungen können wir jetzt gemischte Listen eines bestimmten übergeordneten Typs in Import- und Exportzuordnungen unterstützen. In diesem Artikel erkläre ich, wie Sie die neue Funktionalität nutzen können.
1. Beispiel für XML-Vererbung
In diesem Artikel verwende ich das folgende XML-Schema als Beispiel:
<?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>
Das Schema hat ein Stammelement mit einem Element namens Person vom Typ „PersonType“, das ein- oder mehrmals vorkommt. „PersonType“ ist ein abstrakter Typ, was bedeutet, dass Objekte vom Typ „PersonType“ nicht erstellt werden können. Es gibt zwei Typen, die „PersonType“ erweitern: „EmployeeType“ und „CustomerType“. XML, das gemäß diesem XML-Schema gültig ist, ist also eine gemischte Liste von Kunden und Mitarbeitern mit mindestens einem Eintrag. Ein Beispiel-XML mit 3 Einträgen: ein Mitarbeiter, ein Kunde und ein weiterer Mitarbeiter, wird unten angezeigt:
<?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>
Im XML stehen die Mitarbeiter und die Kunden in „Person“-Tags und geben den Typ durch Angabe des Attributs xsi:type an. Sie haben die Attribute Name und Adresse gemeinsam und erweitern diese jeweils um Gehalt und Unternehmen, wie im XML-Schema angegeben.
2. XML-Vererbung im Elementauswahlbildschirm
Wenn Sie ein Mapping für ein XML-Schema in Mendix, erstellen Sie zunächst ein XML-Schemadokument und importieren das XML-Schema. Anschließend erstellen Sie ein Import- oder Export-Mapping-Dokument und klicken auf „Elemente auswählen“. Anschließend wählen Sie das XML-Schema im Bildschirm „Elemente auswählen“ aus und Sie sehen den in Abbildung 1 gezeigten Bildschirm.

Abbildung 1. Bildschirm „Elemente auswählen“ für eine Exportzuordnung mit unserem Beispiel-XML-Schema
Im Auswahlbaum sehen wir drei Ebenen. Erstens gibt es die „Root“-Ebene. Zweitens gibt es die Vererbungsebene, die das Element mit dem Namen Person und dem Typ „PersonType“ im XML-Schema darstellt. In der dritten Ebene werden alle zulässigen Untertypen von „PersonType“ angezeigt. In diesem Fall bedeutet das „CustomerType“ und „EmployeeType“. Wenn „PersonType“ im XML-Schema nicht abstrakt gewesen wäre, wäre es auch hier verfügbar gewesen. Alle Typen, die Sie hier auswählen, sind im Mapping-Dokument vorhanden. Jeder Typ, den Sie in das Mapping aufnehmen, wird exportiert oder importiert (je nach Dokumenttyp), wenn das Mapping in einem Mikrofluss aufgerufen wird. Objekte eines Typs, den Sie nicht auswählen, werden stillschweigend ignoriert. So wie die Auswahl jetzt ist, exportiert das Mapping also nur Personen vom Typ „CustomerType“ und nicht vom Typ „EmployeeType“. Wenn die aktuelle Auswahl für eine Importzuordnung getroffen worden wäre, würden alle Objekte im eingehenden XML vom Typ „EmployeeType“ von der Zuordnung ignoriert.
In Abbildung 1 können Sie auch sehen, dass eine Reihe von Elementen aktiviert sind und nicht deaktiviert werden können, da die Kontrollkästchen deaktiviert sind. Für den Stamm- und Vererbungsknoten gilt dies, da sie obligatorisch sind: Sie müssen genau einmal (Stamm) oder mindestens einmal (Vererbung) vorkommen. Für den „CustomerType“ ist dies der Fall, da für jeden ausgewählten Vererbungsknoten mindestens ein untergeordneter Knoten ausgewählt werden muss. Wenn Sie auch den Knoten „EmployeeType“ auswählen, können Sie den „CustomerType“ deaktivieren (siehe Abbildung 2).

Abbildung 2. Bildschirm „Elemente auswählen“: „EmployeeType“ ebenfalls ausgewählt
3. XML-Vererbung in Exportmappings
Wenn Sie im Auswahlbildschirm des vorherigen Abschnitts alle Elemente auswählen und auf „OK“ klicken, wird das in Abbildung 3 dargestellte Export-Mapping-Dokument angezeigt.
Abbildung 3. Leeres Exportmapping mit einem Vererbungselement
Wie funktioniert ein Exportmapping? Ziel eines Exportmappings ist die Übersetzung eines Mendix Objekt in ein XML-Dokument (oder einen Teil eines XML-Dokuments). Auf der rechten Seite in Abbildung 3 sehen Sie die Elemente, die Sie im Bildschirm „Elemente auswählen“ ausgewählt haben. Dies ist die XML-Struktur, die wir erstellen möchten. Auf der linken Seite müssen Sie angeben, welche Entitäten und Attribute zum Erstellen dieser XML-Struktur verwendet werden müssen und wie diese abgerufen werden. Sie können die Entitäten auswählen, indem Sie Entitäten (definiert im Domänenmodell) auf die Platzhalter aus dem Connector-Menü ziehen. Anschließend können Sie auf die gezogene Entität doppelklicken, wählen, ob Sie das Objekt durch Assoziation oder durch Mikrofluss abrufen möchten, und auswählen, welche Attribute aus dem Mendix Welchen Attributen in den XML-Elementen sollen die von Ihnen hineingezogenen Entitäten zugeordnet werden? Wie Sie Exportzuordnungen konfigurieren, wird ausführlicher erläutert in Kapitel 4 dieses Blogbeitrags zum Thema Mapping-Dokumente.
Um zu zeigen, wie das alles für Vererbungszuordnungselemente funktioniert, werde ich Sie durch die Vervollständigung der Exportzuordnung für das Beispiel führen. Sehen Sie sich zunächst Abbildung 4 für das Domänenmodell an, das ich verwenden werde. In der Abbildung sehen Sie eine Entität „Sammlung“ mit einer 1..*-Assoziation zu einer Entität „Person“. Die Entität „Person“ hat zwei Zeichenfolgeattribute: „Name“ und „Adresse“. Schließlich gibt es zwei Entitätstypen, die „Person“ als Generalisierung verwenden: „Mitarbeiter“ mit einem ganzzahligen Attribut „Gehalt“ und „Kunde“ mit einem Zeichenfolgeattribut „Unternehmen“.
Abbildung 4. Domänenmodell für das Beispiel
Nun verbinden wir die Entitäten in unserem Domänenmodell mit den XML-Elementen im Exportmapping. Das Endergebnis ist in Abbildung 5 dargestellt und ich werde es weiter unten erläutern.
Abbildung 5. Die fertige Exportzuordnung
Wenn Sie ein Exportmapping aus einem Microflow aufrufen, übergeben Sie ein Mendix Objekt, das in XML konvertiert werden soll. Der Typ dieser Entität sollte derselbe sein wie der Mendix Objekt, das Sie dem Stamm des Mapping-Dokuments zuordnen möchten. Wir haben die Entität „Sammlung“ dorthin gezogen. Wenn Sie dieses Mapping aufrufen, sollten Sie daher ein Mendix Objekt vom Typ „Sammlung“. Wenn die Zuordnung aufgerufen wird, wird ein XML-Element namens „root“ erstellt. Die folgende Ebene ist das Vererbungselement vom Typ „PersonType“. Wir haben hier die Entität „Person“ hineingezogen. Das Zuordnungselement auf Vererbungsebene unterscheidet sich von regulären Zuordnungselementen, da es kein XML-Element erstellt (deshalb wird für diese Ebene kein Pfeil gezeichnet). Stattdessen wird es verwendet, um den gemeinsamen übergeordneten Typ für alle zulässigen Untertypen für dieses XML-Element anzugeben. In diesem Beispiel haben wir die Entität „Person“ hineingezogen, da dies das übergeordnete Element der Entitäten „Employee“ und „Customer“ ist, die wir darunter hineingezogen haben, um sie den XML-Elementen „CustomerType“ und „EmployeeType“ zuzuordnen.
Was die Vererbungszuordnungselemente außerdem von normalen Zuordnungselementen unterscheidet, ist, dass Sie nur konfigurieren, wie das Objekt abgerufen wird. Im Beispiel erhalten wir das Objekt über die Assoziation „Person_Collection“. Wir haben dies im in Abbildung 6 gezeigten Bildschirm konfiguriert, den Sie durch Doppelklicken auf das Vererbungszuordnungselement erreichen.
Abbildung 6. Abrufen eines Objekts für ein Vererbungszuordnungselement
Wir ordnen hier keine Attribute zu, da das Zuordnungselement auf Vererbungsebene kein XML-Element erstellt. Es dient nur dazu, anzugeben, wie das Objekt und der übergeordnete Typ für alle zulässigen Untertypen abgerufen werden. In den Zuordnungselementen für diese Untertypen ist es umgekehrt. Dort müssen Sie nicht angeben, wie die Objekte abgerufen werden, da dies bereits im Zuordnungselement auf Vererbungsebene konfiguriert ist. Sie müssen jedoch angeben, wie die Attribute zugeordnet werden, da für jedes Objekt dieses Typs ein tatsächliches XML-Element erstellt wird. Im Beispiel wird für jeden „Kunden“ in der Sammlung ein XML-Element „Kundentyp“ mit dem „Namen“, der „Adresse“ und der „Firma“ aus dem „Kunden“ erstellt. Mendix Objekt. Für jeden 'Mitarbeiter' wird ein 'MitarbeiterTyp' XML-Element mit dem 'Namen', der 'Adresse' und dem 'Gehalt' des 'Mitarbeiters' erstellt. Mendix Objekt. Wir haben dies im in Abbildung 7 gezeigten Bildschirm konfiguriert, den Sie durch Doppelklicken auf das Zuordnungselement „CustomerType“ erreichen.
Abbildung 7. Zuordnung der Attribute für das XML-Element „CustomerType“
4. XML-Vererbung in Importmappings
Wenn Sie alle Elemente aus dem Beispiel-XML-Schema für eine Importzuordnung auswählen, wird das in Abbildung 8 dargestellte Importzuordnungsdokument angezeigt.
Abbildung 8. Leeres Importmapping mit einem Vererbungselement
Das Import-Mapping ähnelt dem Export-Mapping, es gibt jedoch einige wichtige Unterschiede. Zum einen zeigen die Pfeile von rechts nach links und zeigen damit an, dass die XML-Elemente in das System gelangen und in Mendix Objekte. Aus diesem Grund unterscheidet sich die Konfiguration auch von Exportmappings. Zunächst habe ich die Entitäten in unserem Domänenmodell (siehe Abbildung 4) erneut mit den XML-Elementen im Importmapping verbunden. Das Endergebnis ist in Abbildung 7 dargestellt und ich werde es weiter unten erläutern.
Abbildung 9. Die fertige Importzuordnung
Was macht also ein Importmapping? Es nimmt eingehende XML-Elemente und übersetzt sie in Mendix Objekte. Wenn ein XML-Element eingeht, gibt es drei Methoden, um ein Objekt zu erhalten: „Neues Objekt erstellen“, „Nach Schlüssel suchen“ und „Mikroflow aufrufen“. In Abbildung 9 sehen Sie über dem Pfeil „Neues Objekt erstellen“ für jede der drei Ebenen, für die ein Mendix Objekt muss beschafft werden. Das bedeutet, wir erstellen ein neues leeres Mendix Objekt, bevor wir mit dem nächsten Schritt im Mapping fortfahren. Anschließend werden die Attribute auf die erhaltenen Mendix Objekt, wie Sie es im Mapping konfiguriert haben (in einem Bildschirm ähnlich wie in Abbildung 7). Schließlich können Sie eine Zuordnung zum übergeordneten Objekt festlegen. Wie Sie Importmappings konfigurieren, wird ausführlicher erläutert in Kapitel 3 dieses Blogbeitrags zum Thema Mapping-Dokumente.
Genau wie bei den Exportmappings unterscheidet sich das Mapping-Element auf Vererbungsebene von regulären Mapping-Elementen. Nur für die untergeordneten Elemente des Elements auf Vererbungsebene müssen wir angeben, wie ein Objekt abgerufen wird („neues Objekt erstellen“, „nach Schlüssel suchen“ oder „einen Microflow aufrufen“) und wie die Attribute vom XML-Element auf das Mendix Objekt. Dies wird in Abbildung 9 dadurch visualisiert, dass der Pfeil für das Element der Vererbungsebene nicht gezeichnet wird. Ob und welche Assoziation auf dem erhaltenen Mendix Objekt, wird jedoch im Vererbungszuordnungselement konfiguriert, da die importierten Objekte vom Typ „Kunde“ und „Mitarbeiter“ in derselben Sammlung landen müssen, um dem XML-Schema zu entsprechen.
5. XML-Vererbung und Verwendung von „Automatisch zuordnen“ zum Ausfüllen Ihrer Zuordnungen
Wenn Sie ein neues Mapping-Dokument erstellen, kann es recht mühsam sein, die XML-Elemente zunächst mit Entitäten, Assoziationen und Attributen zu verbinden. Die Hilfsfunktion „Automatisch zuordnen“ hilft Ihnen dabei, indem sie Domänenmodell-Entitäten und Assoziationen findet oder erstellt und sie dem Mapping hinzufügt, um Ihnen viel manuelle Arbeit abzunehmen. Diese Hilfsfunktion arbeitet auch mit Vererbung und erstellt die erforderliche Vererbungsstruktur im Domänenmodell. Beachten Sie, dass bei einem teilweise vorhandenen Domänenmodell keine Entitätsgeneralisierungen automatisch erstellt werden, wenn dies Auswirkungen auf das Persistenzverhalten der Entität hat. Daher kann nach der Verwendung der Funktion „Automatisch zuordnen“ noch etwas Arbeit übrig bleiben. Weitere Informationen finden Sie im Automatisch zuordnen Abschnitt in der Dokumentation.
6. Konvertieren alter Projekte mit XML-Schemata mit XML-Vererbung
In diesem Abschnitt werde ich erläutern, wie Sie Ihre alten Projekte mit XML-Vererbung aktualisieren können auf Mendix 6.1. Dazu zeige ich zunächst, wie das Domänenmodell (siehe Abbildung 10), das Exportmapping (siehe Abbildung 11) und das Exportmapping (siehe Abbildung 11) für das Beispiel-XML-Schema aussehen könnten in Mendix 6.0 und ältere Versionen.
Abbildung 10. Domänenmodell für Beispiel-XML-Schema in Mendix 6.0
Abbildung 11. Export-Mapping für Beispiel-XML-Schema in Mendix 6.0
Abbildung 12. Import-Mapping für Beispiel-XML-Schema in Mendix 6.0
In diesen Abbildungen fällt auf, dass die Sammlungsentität zwei separate Assoziationen mit 'Kunde' und 'Mitarbeiter' hat (ohne eine abstrakte 'Person'-Entität) und dass die zusätzliche Ebene für die Vererbungsebene in den Zuordnungen nicht vorhanden ist. Wenn wir dieses Projekt in Mendix 6.1 sehen wir die in Abbildung 13 dargestellten Konsistenzfehler.
Abbildung 13. Konsistenzfehler nach dem Upgrade des Projekts auf Mendix 6.1
Um diese zu beheben, klicken Sie zunächst mit der rechten Maustaste auf die ersten beiden Konsistenzfehler und klicken Sie auf „Durch Aktualisieren vom Schema beheben“, um die Zuordnungen mit dem XML-Schema neu auszurichten. Dadurch wird die Importzuordnung aktualisiert, sodass sie wie in Abbildung 14 aussieht, und die Exportzuordnung, sodass sie wie in Abbildung 15 aussieht.
Abbildung 14. Import-Mapping nach der Aktualisierung aus dem Schema
Abbildung 15. Mapping nach der Aktualisierung aus dem Schema exportieren
Die verbleibenden Konsistenzfehler können wie folgt behoben werden. Aktualisieren Sie zunächst das Domänenmodell so, dass es Abbildung 4 ähnelt, indem Sie eine Generalisierungsentität für „Mitarbeiter“ und „Kunde“ („Person“) mit einer einzigen Assoziation mit „Sammlung“ einführen. Sie benötigen die Assoziationen „Mitarbeiter_Sammlung“ und „Kunden_Sammlung“ nicht mehr. Bedenken Sie jedoch, dass Sie Ihre Daten migrieren müssen, wenn Sie Änderungen an den Assoziationen in Ihrem Domänenmodell vornehmen, wenn Ihre App vorhandene Daten enthält und diese beibehalten möchte. Ziehen Sie abschließend die Entität „Person“ auf den leeren Platzhalter in der Import- und Exportzuordnung. Die Konsistenzfehler sollten dann behoben sein. Sie erhalten Zuordnungen wie in Abbildung 5 und 9.
In Situationen, in denen Sie nur einen Subtyp eines Vererbungselements ausgewählt haben, gibt es einen Trick, um die oben genannten Schritte zum Ändern Ihres Domänenmodells zu vermeiden. Wenn Sie beispielsweise in Ihrem Dialogfeld „Elemente auswählen“ nur den „Kundentyp“ ausgewählt haben, müssen Sie keine Generalisierung vornehmen (die Entität „Person“) und können stattdessen die Entität „Kunde“ auch auf der Vererbungsebene verwenden. Dies funktioniert, weil ein „Kunde“ ein „Kunde“ ist und keine anderen Subtypen ausgewählt sind, die eine Spezialisierung des „Kunden“ sein müssen. Die so erstellte Exportzuordnung ist in Abbildung 16 dargestellt.
Abbildung 16. Export-Mapping mit nur ausgewähltem „CustomerType“













