Objekt aus Server XML erzeugen

Wertauflöser - Kurzfassung

Zweck: Versucht eine als Eingabewert übergebene Zeichenfolge als als XML zu parsen und als Server-XML-Format zu interpretieren, um ein Objekt zurückzugeben.

Siehe auch: Server XML aus Objekt erzeugen

images/download/attachments/102602396/image2022-6-9_17-29-2-version-1-modificationdate-1654788543005-api-v2.png

Der Objekt aus Server XML erzeugen-Wertauflöser versucht eine als Eingabewert übergebene Zeichenfolge als XML zu parsen und als Server-XML-Format (s. Server Datenencoder) zu interpretieren, um ein Objekt zurückzugeben.

Dabei sind folgende Fälle zu unterscheiden:

Eingabewert (abstrakt)

Eingabewert (konkrete Beispiele)

Rückgabewert

Fehler

kein Wert ($null)

kein Wert ($null)

kein Wert ($null)

n/a

Eine Zeichenfolge, die kein wohlgeformtes XML definiert

leere Zeichenfolge ("")


abcXYZ


<missingSlashInClosingTag>XYZ<missingSlashInClosingTag>

n/a

ProcessException:Failed to unmarshal

Eine Zeichenfolge, die ein wohlgeformtes XML ergibt, das sich auf ein für den Server unbekanntes root-Element bezieht

<unknownRootElement>XYZ</unknownRootElement>

n/a

ProcessException: Failed to unmarshal

Eine Zeichenfolge, die ein wohlgeformtes XML ergibt, das sich auf ein für den Server definierten root-Element-Typ (hier: any) bezieht, aber dessen Schema missachtet.

HINWEIS Im serverseitig angewendeten Schema nicht vorgesehene Inhalte werden ignoriert!1

<any>123</any>

kein Wert ($null)

n/a

<any><value>123</value></any>

Datenobjekt mit einem Feld value, das keinen Wert ($null) enthält

n/a

Eine Zeichenfolge, die ein wohlgeformtes XML ergibt, das sich auf einen für den Server definierten root-Element-Typ (hier: any) bezieht und erfolgreich gegen dessen Schema validiert werden kann.

HINWEIS Im serverseitig angewendeten Schema nicht vorgesehene Inhalte werden ignoriert!


<any xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <value xsi:type="xsd:long">123</value></any>

123
(Long-Wert)

n/a

<?xml version="1.0" encoding="UTF-8"?>
<ord:Order xmlns:ord="SCM.ORDER" creatorId="1901" ownerId="1902" lastModified="1638460649053.053000000" lastModifierId="1901" numberOfPackages="3">
<attributes>
...
</attributes>
<lineItems>
... </lineItem>
</lineItems>
</ord:Order>

Entität des Typs "Bestellung" (ord:Order);
s. Bestellungen

n/a

Konfiguration

Der Wertauflöser verwendet keine Parameter.

Als Eingabewert wird die Zeichenfolge erwartet, die vom Server als XML für ein Datenobjekt geparst werden soll.

Beispiele

Suche-Objekt als Eingabewert für eine "View" erzeugen

In Verbindung mit der Öffne View (Aktion) und dem Abfragekonfigurator kann der Objekt aus Server XML erzeugen-Wertauflöser hilfreich sein, um ein Objekt vom Typ "Suche" (search) als Eingabewert für eine Übersicht zu generieren.

Die Vorgehensweise wird im Beispiel für die Öffne View (Aktion) detailliert beschrieben. Deshalb wird hier nur kurz auf den Zweck und den Einsatz des Objekt aus Server XML erzeugen-Wertauflösers eingegangen:

Wie der Screenshot zeigt, wird eine Öffne View (Aktion)-Ereignisaktion im Kontext einer bestimmten Bestellposition (selectedLineItem) ausgeführt.

Die Ereignisaktion soll eine Übersicht für Bestellungen öffnen, in der alle Bestellungen erscheinen, die über mindestens eine Bestellposition verfügen, deren Wert für das Textattribut "Warenbeschreibung" (GOODS_DESCRIPTION) mit der "Warenbeschreibung" für die aktuelle Bestellpostion (selectedLineItem) übereinstimmt.

Diese Bedingung kann in einer Suche im Abfragekonfigurator für eine konkrete "Warenbeschreibung" recht einfach formuliert und getestet werden. Anstelle einer konkreten "Warenbeschreibung" kann man in der so erstellen und getesteten Suche dann eine eindeutige Textmarke (im Beispiel "@1:s") einsetzen, die zur Laufzeit als Parameter dynamisch interpretiert - also durch einen konkreten Textwert ersetzt - werden soll.

Aus dem Abfragekonfigurator kann die XML-Definition für die Suche (inkl. Parameter) in die Zwischenablage kopiert, um sie - wie im Screenshot zu sehen - als statischen Text (s. Statische Werte) einfügen und weiterverarbeiten zu können:

  • Konkret wird hier zunächst durch eine verkettete Text ersetzen-Ereignisaktion der Parameter (Textmarke "@1:s") durch die gesuchte "Warenbeschreibung" ersetzt. Damit beschreibt die Zeichenfolge das Such-Objekt für die zu öffnende View im Server-XML-Format.

  • Der verkettete Objekt aus Server XML erzeugen-Wertauflöser wandelt diesen XML-Text in ein Suche-Objekt um, das als Eingabewert (im Parameter Entität) an die zu öffnende View übergeben werden kann, sodass eine Übersicht mit der auf diesem Weg elegant darstellbaren individuellen "Restriktion" erscheint.

HINWEIS◄ Das Beispiel für Öffne View (Aktion) beschreibt weitere Details, die für eine erfolgreiche Umsetzung nach diesem Schema zu beachten sind.

images/download/attachments/102602396/image2021-3-17_8-0-47-version-1-modificationdate-1655217199092-api-v2.png

XML-Daten einer Entität per "Textverarbeitung" manipulieren

Das folgende Beispiel zeigt, wie der Objekt aus Server XML erzeugen-Wertauflöser in Verbindung mit dem Server XML aus Objekt erzeugen-Wertauflöser eingesetzt werden kann, um die Daten einer Entität - hier vom Typ "Bestellung" (s. Bestellungen) - so zu manipulieren, dass die manipulierten Daten eine neue Entität - hier vom Typ "Sendung" (s. Sendungen) definieren. Dabei sollen alle Merkmale der "Bestellung" auf die "Sendung" übertragen werden, die das XML-Schema für Sendungen unterstützt.

Laufzeitbeispiel:

Aus einer Bestellung mit den folgenden Angaben zu beteiligten Firmen und Positionen wird "per Knopfdruck" - genauer: indem ein Eigenes Aktionsevent per Ribbon Button ausgelöst wird - eine Sendung erstellt, die auf Sendungen abbildbaren Merkmale der Bestellung widerspiegelt:

images/download/attachments/102602396/runtime_1-version-1-modificationdate-1655301439250-api-v2.PNG

Zur Demonstration wird die erstellte Sendung hier in einer ähnlich aufgebauten Erfassungsmaske wiedergegeben:

images/download/attachments/102602396/runtime_2-version-1-modificationdate-1655301477568-api-v2.PNG

  • Das Feld "Bestelltyp" (orderType) ist im Schema für Sendungen nicht vorgesehen. Es entfällt in den Daten der erzeugten Sendung.

  • Die beteiligten Firmen und Positionen werden komplett übertragen. Für die Sendungspositionen sieht die Maske zusätzliche Felder vor, die natürlich leer bleiben.

images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg ACHTUNGimages/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg Das Umwandeln eines Entitätstyps in einen anderen durch die Manipulation von XML-Daten sollte nicht als "gute Praxis" missverstanden werden. Es ist im Allgemeinen keine empfehlenswerte Methodik zur Datenmanipulation und dient hier nur als Demonstrationsbeispiel für den Einsatz des Objekt aus Server XML erzeugen-Wertauflösers. Ein Lobster_data-Profil (mit Mappings zwischen den zugehörigen Lobster_pro Vorlagen) oder eine Ereignisbehandlung mit einer konkreten Sequenz von Wertzuweisungen lösen die systematische Datentransformation zwischen zwei Entitätstypen sicher robuster, flexibler und wartungsfreundlicher als die folgende Konfiguration. Nur weil die Datenmodelle bzw. Schemas von Bestellungen und Sendungen weitgehend kompatibel sind, ist der Weg einer "Textverarbeitung" auf der Ebene der Server-XMLs überhaupt gangbar. Die beschriebene "Textverarbeitung" erhebt auch nicht den Anspruch jede für eine Bestellung denkbare "Datenlage" abzudecken.

Konfiguration:

Die Ereignisbehandlung, deren Ereignisaktionen rechts abgebildet sind, wird im Kontext einer Bestellung über ein Eigenes Aktionsevent (per Ribbon Button) ausgelöst. Eine Typprüfung in der "Prüfenden Regel" (nicht im Bild) stellt sicher, dass als Eingabewert eine Bestellung anliegt.

Die Umwandlung von der Bestellung zur Sendung erfolgt im Kopf einer Ausführen mit-Ereignisaktion, in deren Kontext die zu erstellende Sendung als abweichendes Bezugsobjekt gilt. Eine Verkettung von Wertauflösern führt folgende Schritte aus:

  • Der Server XML aus Objekt erzeugen-Wertauflöser liefert den Server-XML-Text der Bestellung als Ausgangspunkt für die "Textverarbeitung".

  • Eine Serie von vier Text ersetzen-Wertauflösern manipuliert das Server-XML in folgenden Schritten (Details s. unten):

    • Namespace anpassen

    • Präfix für spezifische Elemente anpassen

    • id-Attribut entfernen (wo nötig, s. Hinweis)

    • lastModified-Attribut entfernen (wo nötig, s. Hinweis)

  • Der Objekt aus Server XML erzeugen-Wertauflöser erzeugt aus dem modifizierten Server-XML ein Datenobjekt, das eine neue Sendung mit den Merkmalen der Bestellung definiert. In diesem Schritt gehen die Merkmale verloren, die nicht mit dem Schema für Sendungen vereinbar sind (z. B. "Bestelltyp").

  • Der Eingabeobjekt (Typsicher)-Wertauflöser wird hier nur eingesetzt, damit der Kontext "Sendung" für die Konfigurationen im Aktionsblock der Ausführen mit-Ereignisaktion deklariert ist.

Der Aktionsblock definiert folgende Aktionen im Kontext der neuen Sendung:

  • Per Setze Wert-Aktion wird die von der Bestellung übernommene Referenz für den "Aktuellen Arbeitsstatus" gelöscht.

  • Die Änderungen später speichern-Ereignisaktion merkt die Sendung zum Speichern beim Abschluss der Transaktion vor. Da keine weiteren Aktionen folgen, wird die Sendung also erstellt, sofern das keine Fehlermeldungen impliziert.

HINWEIS◄ Das Entfernen der Entitätsattribute id und lastModified ist für alle Entitäten erforderlich, die im Kontext der Sendung neu erstellt werden sollen. Das betrifft Attribute, Positionen und den Kopf der Entität (das root-Element im XML).

images/download/attachments/102602396/actions_1-version-2-modificationdate-1655300747619-api-v2.PNG

images/download/attachments/102602396/resolver_2-version-1-modificationdate-1655300924552-api-v2.PNG

Das Namespace-Attribut xmlns:ord sollte nur im root-Element (ord:Order) des XMLs der Bestellung vorkommen. Es kann daher durch einfaches Text ersetzen identifiziert und durch den entsprechenden Eintrag für Sendungen (xmlns:shp="SCM.SHIPMENT") ersetzt werden.

images/download/attachments/102602396/resolver_3-version-1-modificationdate-1655300951533-api-v2.PNG

An allen Stellen, wo das XML der Bestellung auf den Namespace ord verweist muss für die Sendung der Namespace shp angegeben werden. In allen relevanten Fällen folgt auf den Namen des Namespaces auch ein Klassenname für das betreffende Element, der für Bestellungen mit Order und für Sendungen mit Shipment beginnt.

Der Reguläre Ausdruck für die Ersetzung soll für öffnende und schließende Tags im XML greifen:

  • im Kopf: <ord:Order>...</ord:Order><shp:Shipment>...</shp:Shipment>

  • für Attribute (z. B.): <ord:OrderText>...<ord:OrderText><shp:ShipmentText>...</shp:ShipmentText>

Der Suchtext (<[/]?)ord:Order identifiziert in unserem Beispiel alle relevanten Stellen. Beim Ersetzen wird die Einleitung des Tags ($1) beibehalten, die Kombination von Namespace und Klassenpräfix dagegen ersetzt.

images/download/attachments/102602396/resolver_4-version-1-modificationdate-1655300980476-api-v2.PNG

Das Entfernen der Entitätsattribute (id und lastModified) aus relevanten Elementen erfolgt in zwei separaten Schritten, um sicherzustellen, dass das Ersetzten unabhängig von der Reihenfolge der Attribute funktioniert.

Der Reguläre Ausdruck ist dabei jeweils nach demselben Schema aufgebaut:

  • Die erste Gruppe (in den Screenshots jeweils die erste Zeile) identifiziert den öffnenden Tag für ein relevantes Element - hier eines dessen Name mit der Zeichenfolge shp:Shipment (entsprechende Textabschnitte wurde im vorherigen Schritt bereits "konvertiert") oder lineItem beginnt - und lässt danach bis zum Abschluss des Tags (>) weitere Zeichen zu.

  • Die zweite Gruppe (in den Screenshots jeweils die zweite Zeile) identifiziert das zu eliminierende Entitätsattribut und seinen Wert.

Als Wert für Ersetzen mit wird nur die erste Gruppe ($1) angegeben, die vom Beginn des Tags bis zum Leerzeichen vor dem zu eliminierenden Attribut reicht. Das unerwünschte Attribut wird also entfernt. Der nachfolgende Text bleibt unverändert erhalten.

HINWEIS◄ Die Entitätsattribute (id und lastModified) dürfen nicht pauschal aus allen Tags entfernt werden, da die Struktur der Sendung eingebettete Entitäten enthalten kann, die unbedingt inklusive ihrer Entitätsattribute in die Sendung übernommen werden sollen. In unserem Beispiel betrifft das z. B. die Adressen, die in Firmen- und Adressattributen enthalten sind.