XML-Auswahlelemente und XML-Domänenzuordnungen
XSD-Auswahlelemente dienen zur Angabe einer Anzahl von Alternativen, von denen nur eine in einer XML-Datei vorhanden sein kann. Bisher wurde der Import von Daten aus XML-Dateien, die Auswahlelemente enthielten, in der Mendix Plattform, aber mit der Veröffentlichung der Version 5.14 wurde dies behoben. In diesem Artikel erklären wir, warum dies wichtig ist und wie Sie die neue Funktionalität nutzen können.
1. Aktuelle Situation und Einschränkungen
Integrieren Mendix Anwendungen mit der Außenwelt können XML-Dokumente importiert und erstellt werden Mendix Objekte basierend auf den im Dokument enthaltenen Informationen. Dazu sind zwei Dinge erforderlich. Erstens ein XML-Schemadokument (XSD-Datei), das beschreibt, wie die XML-Daten aussehen dürfen, um die darin beschriebenen Objekte erkennen zu können. Zweitens eine Übersetzung dieser XML-Objekte in Mendix Objekte benötigt. Ein Benutzer der Mendix Plattform beschreibt diese Übersetzung in einem XML-zu-Domäne-Mapping-Dokument und dieses Dokument ist das Hauptthema dieses Artikels. In diesem Dokument muss der Benutzer Folgendes konfigurieren:
- Was Mendix Objekte müssen erstellt werden
- Wie diese Objekte miteinander verknüpft werden müssen
- Wie die Attribute dieser Entitäten ausgefüllt werden müssen
Um dem Benutzer bei der Erstellung dieses Dokuments zu helfen, gibt es schließlich eine Funktion zum Erstellen der Mendix Entitäten automatisch basierend auf den definierten Elementen im XML-Schema.
Die wichtigsten Einschränkungen bei der Umsetzung der oben beschriebenen Situation wurden in Version 5.14 behoben und werden in diesem Artikel erläutert. Diese Einschränkungen waren:
- Alternativen für die Auswahl wurden als separate Assoziationen für die Entität betrachtet, die auf die Auswahl verweist.
- Die Multiplizität des Auswahlelements ging verloren (alle verschiedenen Auswahlmöglichkeiten hatten die Multiplizität 1, auch wenn das XML-Schema eine Liste definierte).
- Auswahlelemente wurden in der Zuordnung nicht explizit angezeigt, was intransparent war.
- Beim automatischen Generieren von Entitäten für das Mapping würden vorhandene Entitäten nicht wiederverwendet.
Im weiteren Verlauf dieses Artikels erklären wir, wie die oben genannten Probleme gelöst wurden. Daher richtet er sich an Mendix Entwickler, die XML-zu-Domäne-Mappings im Allgemeinen verwenden, und Personen, die XML-Schemadokumente mit Auswahlelementen im Besonderen verwenden. Zunächst führen wir in Abschnitt 2 ein explizites Beispiel eines XML-Schemas mit einem Auswahlelement ein, um die neue Funktionalität zu veranschaulichen. Anschließend veranschaulichen wir in Abschnitt 3 die Einschränkungen, indem wir das Beispiel in Aktion zeigen. Mendix Plattform vor Version 5.14. Anschließend verwenden wir in Abschnitt 4 dasselbe Beispiel, um zu veranschaulichen, wie dies in Version 5.14 behoben wurde. Schließlich veranschaulichen wir in Abschnitt 5 den Wert der Änderungen weiter, indem wir die umfangreicheren Typinformationen in der neuen XML-zu-Domäne-Zuordnung in einem Mikrofluss verwenden.
2. Unser Beispiel: Personen
Wir betrachten das folgende XML-Schema:
<?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>
Dieses Schema definiert ein Element „Personen“. Es enthält eine Liste von Auswahlelementen, die jede „Person“ widerspiegeln (minOccurs=”0” maxOccurs=”unbounded”). Jeder Eintrag in dieser Liste ist entweder ein „Mitarbeiter“ oder ein „Kunde“ (aber nicht beides).
Dies ist ein Beispiel für eine gültige XML-Nachricht:
<?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>
Hier enthält die Personenliste 3 Einträge: einen Mitarbeiter, einen Kunden und einen weiteren Mitarbeiter.
3. Personenbeispiel in der aktuellen Situation
In diesem Abschnitt zeigen wir, wie das Erstellen eines XML-to-Domain-Mappings basierend auf diesem XML-Schema in der aktuellen Situation funktioniert. Zunächst erstellen Sie ein neues XML-Schemadokument und wählen das XML-Schema aus, das wir in Abschnitt 2 definiert haben. Anschließend erstellen Sie ein neues XML-to-Domain-Mapping, klicken auf „Elemente auswählen“ und wählen im resultierenden Popup das gerade erstellte XML-Schema als Schemaquelle aus.1. Der resultierende Bildschirm wird in Abbildung 1 angezeigt. In dieser Abbildung sehen wir, dass das Auswahlelement nicht im Schemaelementbaum angezeigt wird und dass daher auch seine 0-*-Multiplizität fehlt.

Abbildung 1. Auswählen der XSD-Elemente, die in ein XML-zu-Domänen-Mapping vor Version 5.14 einbezogen werden sollen
Wenn wir alle Elemente auswählen und auf „OK“ klicken, ist die linke Seite der Zuordnung ausgefüllt. Wenn wir anschließend auf „Zuordnungen generieren“ klicken, werden zugehörige Entitäten, Attribute und Assoziationen erstellt (im Domänenmodell, siehe Abbildung 2) und auf der rechten Seite der XML-zu-Domäne-Zuordnung ausgefüllt. Das Ergebnis ist in Abbildung 3 dargestellt. In dieser Abbildung können wir sehen, dass auf der linken Seite tatsächlich die Auswahloption fehlt. Die Hauptfolge davon ist, dass Personen nicht eine Assoziation mit einer Liste haben, die sowohl mit Mitarbeitern als auch mit Kunden (gemischt) gefüllt ist, wie man es von der Definition im XML-Schemadokument erwarten würde, sondern zwei 1:1-Assoziationen, eine zum Mitarbeiter und eine zum Kunden. Dies ist etwas von Natur aus anderes und kann daher zu Datenverlust führen, wenn Listen von Kunden/Mitarbeitern importiert werden, da nur die erste tatsächlich einer Liste zugeordnet ist. Mendix Objekt. Dieses Problem wurde in Version 5.14 des Mendix Plattform, wie wir im nächsten Abschnitt veranschaulichen.

Abbildung 2. Das automatisch generierte Domänenmodell für das Personenbeispiel vor Version 5.14

Abbildung 3. Konfigurieren der Zuordnung in einer XML-zu-Domänen-Zuordnung im Personenbeispiel vor Version 5.14
4. Übertragung des Personenbeispiels auf die neue Situation
In diesem Abschnitt zeigen wir, wie die im vorherigen Abschnitt beschriebene Situation gelöst wird. Wir tun dies, indem wir mit der vorherigen Situation beginnen, die Schritte beschreiben, die zur Konvertierung des Projekts unternommen werden müssen, und über die daraus resultierenden Änderungen nachdenken. Wir tun dies, um den Leuten das Upgrade zu erleichtern. Natürlich ist es durchaus möglich, in der neuen Situation ein neues Projekt von Grund auf neu zu beginnen. Befolgen Sie dazu einfach die gleichen Schritte wie in Abschnitt 3 beschrieben und erweitern Sie diese mit den in diesem Abschnitt beschriebenen zusätzlichen Schritten.
Wenn Sie das Projekt öffnen, das wir in Abschnitt 3 in Version 5.14 des Mendix Um Ihr Projekt zu konvertieren, sind manuelle Schritte auf der Plattform erforderlich. Im Fenster „Fehler“ wird die folgende Fehlermeldung angezeigt: „Das Mapping-Element ist eine Auswahlmöglichkeit. Bitte wählen Sie die Schemaelemente erneut aus und schließen Sie das Auswahlelement ein.“Durch einen Doppelklick auf die Nachricht öffnet sich das XML-to-Domain-Dokument und das entsprechende Element wird ausgewählt (siehe Abbildung 4).

Abbildung 4. Nach der Konvertierung sind manuelle Schritte erforderlich, um das Projekt zu konvertieren
Wie in der Meldung beschrieben, müssen wir Schemaelemente erneut auswählen, um den Konsistenzfehler zu beheben. Klicken Sie dazu auf „Elemente auswählen…“ und der in Abbildung 5 dargestellte Dialog wird angezeigt.

Abbildung 5. Erneutes Auswählen der Schemaelemente nach der Konvertierung
Im Schemaelementbaum sehen wir, dass es jetzt ein explizites Element für das XML-Auswahlelement gibt "(Auswahl)". Beachten Sie, dass die Multiplizität dieses Elements korrekt auf 0..* eingestellt ist. Das Auswahlelement wurde beim Öffnen dieses Fensters automatisch ausgewählt. Klicken Sie daher auf „OK“, um die Einstellung zu speichern und mit der Konfiguration der Zuordnung fortzufahren.
Wie in Abbildung 6 zu sehen ist, ist die "(Auswahl)" Das Mapping-Element wurde in das Import-Mapping-Dokument eingefügt. Die Bedeutung dieses zusätzlichen Mapping-Elements ist folgende: Alle Alternativen für die Auswahl (in diesem Fall Mitarbeiter und Kunde) sollten etwas gemeinsam haben, da sie Alternativen für etwas sind. In diesem Fall besteht die Gemeinsamkeit zwischen ihnen darin, dass sie beide eine Person sind. Daher sollten in der neuen Situation alle Alternativen einer Auswahl von einer allgemeineren Entität (Person) erben und diese Entität sollte in das Mapping gezogen werden. Es ist wichtig, die Bedeutung davon wirklich zu verstehen. Für das Beispiel bedeutet es, dass die Entität „Personen“ eine Liste vom Typ „Person“ hat und Mitarbeiter und Kunden bestimmte Typen von Personen sind, die daher in der Liste erscheinen können.
In Abbildung 6 gibt es vier Konsistenzfehler. Die ersten beiden werden durch Auswahl einer korrekten Generalisierungseinheit für Mitarbeiter und Kunden behoben. Die unteren beiden haben damit zu tun, dass in der ursprünglichen Situation (ohne das explizite Auswahlelement) die Auswahlalternativen selbst (Mitarbeiter und Kunde) Assoziationen mit Personen in der Zuordnung hatten. Dies ist nicht mehr zulässig, da dies im Auswahlelement konfiguriert werden sollte. Um dies zu beheben, doppelklicken Sie auf Mitarbeiter und Kunde. Es wird eine Meldung angezeigt, die erklärt, dass die Assoziation entfernt wird. Klicken Sie auf OK, um dies zu bestätigen.

Abbildung 6. Das XML-zu-Domäne-Mapping-Dokument nach Auswahl des neuen (Auswahl-)Elements
Die ersten beiden Konsistenzfehler können behoben werden, indem Sie manuell eine Generalisierungsklasse für Mitarbeiter und Kunden erstellen und diese im Mapping-Dokument auswählen. Alternativ können Sie die Schaltfläche „Automatisch mappen“ verwenden, die dies für Sie erledigt. Wenn Sie auf diese Schaltfläche klicken, wird die in Abbildung 7 dargestellte Meldung angezeigt, die erklärt, was getan wurde.

Abbildung 7. Eine Übersicht über die Änderungen bei der automatischen Generierung der Zuordnungen, Entitäten, Assoziationen und Attribute
Hier sehen Sie, dass die meisten Entitäten und Assoziationen in der Zuordnung aus der vorherigen Situation beibehalten wurden. Für das Auswahlelement wurde eine Klasse namens ChoiceBase erstellt, Mitarbeiter und Kunde wurden zu Spezialisierungen dieser Klasse und ChoiceBase ist mit der Entität „Personen“ verknüpft. Dies ist eine große Verbesserung gegenüber der Art und Weise, wie die „Automatisch zuordnen..“ Die Funktion erstellte in früheren Versionen Entitäten, Attribute und Assoziationen, da sie bei jeder Ausführung alle Entitäten, Attribute und Assoziationen neu erstellte, was zu einem immer größer werdenden Domänenmodell voller Entitäten führte, die nicht mehr benötigt wurden.
Das resultierende Domänenmodell ist in Abbildung 8 dargestellt.

Abbildung 8. Das automatisch generierte Domänenmodell für das Personenbeispiel
Beachten Sie, dass wir an diesem automatisch generierten Modell einige Verbesserungen vornehmen können. Erstens ist ChoiceBase ein sehr allgemeiner Begriff und da wir unser eigenes Domänenmodell tatsächlich verstehen, können wir es spezifischer gestalten. Wir können die Entität beispielsweise umbenennen in "Person". Wenn wir das tun, ist es auch eine gute Idee, den „ChoiceBase_Personen“ Assoziation. Anschließend können wir die „Vorname“ und „Nachname“ Attribute von den Entitäten Mitarbeiter und Kunde zu dieser Entität Person, da beide Spezialisierungen diese Attribute enthalten. Schließlich können wir die Assoziationen zwischen Mitarbeitern und Personen sowie Kunden und Personen entfernen, da sie mit der Einführung der Entität Person nicht mehr benötigt werden. Dies liegt daran, dass sie die Assoziation mit Personen von der Entität Person erben. Nachdem alle diese Änderungen vorgenommen wurden, sieht das Domänenmodell wie in Abbildung 9 dargestellt aus.

Abbildung 9. Manuelle Verbesserung des automatisch generierten Domänenmodells für das Personenbeispiel
Nach diesen Änderungen stellen wir vier neue Konsistenzfehler für die XML-zu-Domäne-Zuordnung fest. Diese Konsistenzfehler treten auf, weil wir die „Vorname“ und „Nachname“ Attribute von den Spezialisierungsentitäten (Mitarbeiter und Kunde) zur Generalisierung (Person) und wir müssen diese manuell neu zuordnen. Gehen Sie dazu zur XML-zu-Domäne-Zuordnung und doppelklicken Sie auf Kunde und Mitarbeiter und ordnen Sie die Attribute entweder manuell oder durch Klicken auf das „Attribute nach Namen zuordnen“ Schaltfläche. Dadurch werden alle Konsistenzfehler behoben und das XML-zu-Domäne-Mapping-Dokument sieht wie in Abbildung 10 dargestellt aus.

Abbildung 10. Endgültige Version des XML-zu-Domäne-Mapping-Dokuments für das Personenbeispiel
5. Verwenden der neuen XML-zu-Domäne-Zuordnung
Nachdem wir in den vorherigen Abschnitten erklärt haben, wie man eine XML-zu-Domäne-Zuordnung für XML-Schemata mit Auswahlelementen erstellt und konfiguriert, beenden wir diesen Artikel mit einem Beispiel für die Verwendung dieser Zuordnung in einem Mikrofluss. In diesem Beispiel berechnen wir die Summe der Gehälter aller Mitarbeiter in der importierten XML-Datei und ignorieren dabei die Kunden (für die kein Gehalt definiert ist).
Dazu erstellen wir den in Abbildung 11 dargestellten Microflow. Dabei gehen wir folgendermaßen vor: Zunächst wählen wir als Eingabeparameter ein Filedocument aus. Anschließend ziehen wir ein „XML-Dokument importieren“ Aktion, wählen Sie das Filedocument als Eingabe, unsere definierte XML-zu-Domäne-Zuordnung als Zuordnung und wählen Sie, die Ausgabe in einer Personenvariable zu speichern. Anschließend ziehen wir eine Abrufaktion ein, in der wir die Personenliste über die „Person_Personen“ Assoziation der Personenvariable. Danach erstellen wir eine Variable, um die Summe aller Gehälter zu speichern, und initialisieren sie auf Null. Dann iterieren wir über alle Elemente in der Personenliste und führen eine andere Aktion aus, je nachdem, welcher spezifische Untertyp von Person das Element ist (mithilfe einer Vererbungsaufteilung). Wenn die Person ein Angestellter ist, wandeln wir sie in einen Angestellten um und addieren sein Gehalt zur Summe. Wenn die Person ein Kunde ist, ignorieren wir sie stattdessen. Nachdem wir über alle Elemente iteriert haben, schreiben wir die Summe aller Gehälter in das Protokoll.
Abbildung 11. Microflow zum Summieren der Gehälter aller Kunden in einer XML-Datei unter Verwendung der XML-zu-Domäne-Zuordnung für das Personenbeispiel
Danksagungen
Dieser Artikel wurde von Pieter van Balen und Kevin Dullemond gemeinsam verfasst.