Altova MapForce 2024 Professional Edition

Wie in vorherigen Abschnitt, Zugriff auf Node-Namen, erwähnt, erhalten Sie durch Rechtsklick auf den Node und Auswahl des Kontextmenübefehls Child-Elemente mit generischem Namen anzeigen Zugriff auf alle Chld-Elemente eines Node. Auf diese Art stehen die Namen der einzelnen Child-Elemente über den Node node-name() zur Mapping-Laufzeit Verfügung, während der Wert des Node über einen speziellen Typkonvertierungsnode (im Bild unten der Node text()) zur Verfügung steht.

mf_generic_child_elements

 

Beachten Sie, dass der Datentyp der einzelnen Child-Elemente vor der Mapping-Laufzeit nicht bekannt ist. Jedes Child-Element kann außerdem einen anderen Datentyp haben. So kann z.B. ein product-Node in der XML-Instanz ein Child-Element id vom Typ xs:integer und ein Child-Element size vom Typ xs:string haben. Damit Sie Zugriff auf den Node-Inhalt eines bestimmten Typs haben, wird jedes Mal, wenn Sie den dynamischen Zugriff auf die Child-Elemente eines Node aktivieren, das unten gezeigte Dialogfeld geöffnet. Sie können dieses Dialogfeld auch später jederzeit durch Klick auf die Schaltfläche Auswahl ändern ( mf_ic_change_selection ) neben einem element(-Node aufrufen.

mf_dynamic_node_names_02

Dialogfeld "Einstellungen für dynamisch benannte Child-Elemente"

Es gibt verschiedene Möglichkeiten, um zur Laufzeit Zugriff auf den Inhalt der einzelnen Child-Elemente zu erhalten:

 

1.Aufruf des Inhalts als String. Aktivieren Sie dazu das Kontrollkästchen text() im oben gezeigten Dialogfeld. In diesem Fall wird beim Schließend des Dialogfelds in der Komponente ein text()-Node erstellt. Diese Option eignet sich, wenn der Inhalt einen simpleType hat (xs:int, xs:string, usw.). Eine Beschreibung dazu finden Sie unter Beispiel: Mappen von Elementnamen auf Attributwerte. Beachten Sie, dass ein text()-Node nur angezeigt wird, wenn ein Child Node des aktuellen Node Text enthalten kann.

2.Aufruf des Inhalts als bestimmter complexType, der laut Schema zulässig ist. Wenn laut Schemadefinition global definierte benutzerdefinierte complexTypes für den ausgewählten Node zulässig sind, stehen diese ebenfalls im obigen Dialogfeld zur Verfügung und Sie können das Kontrollkästchen daneben aktivieren. In der Abbildung oben sind im Schema keine complexTypes definiert, daher stehen keine zur Auswahl zur Verfügung.

3.Aufruf des Inhalts als any-Typ. Dies kann in komplexen Mapping-Szenarien hilfreich sein (siehe Zugriff auf tiefer verschachtelte Strukturen") weiter unten. Aktivieren Sie dazu das Kontrollkästchen neben xs:anyType.

 

Beachten Sie, dass MapForce (über den Typkonvertierungs-Node) keinerlei Informationen darüber hat, was für einen Datentyp der Instanz-Node zur Mapping-Laufzeit tatsächlich haben wird. Ihr Mapping muss daher den Node-Inhalt mit dem richtigen Typ aufrufen. Wenn Sie z.B. erwarten, dass der Node einer XML-Quellinstanz Child-Nodes verschiedener complexType-Arten haben kann, gehen Sie folgendermaßen vor:

 a) Setzen Sie den Typkonvertierungs-Node auf den complexTyp, mit dem er übereinstimmen muss (siehe Punkt 2 in der Liste oben).

 b) Fügen Sie einen Filter hinzu, damit nur der gewünschte complexType aus der Instanz ausgelesen wird. Ein Beispiel für diese Methode finden Sie unter Beispiel: Gruppieren und Filtern von Nodes nach Namen.

 

Zugriff auf tiefer verschachtelte Strukturen

Es ist möglich, Zugriff auf Nodes, die sich auf einer Ebene noch unterhalb der unmittelbaren Child-Nodes eines Node befinden, zu erhalten. Dies eignet sich für komplexe Mapping-Szenarien. Bei einfachen Mappings wie z.B. im Beispiel: Mappen von Elementnamen auf Attributwerte ist diese Methode nicht notwendig, da im Mapping nur die unmittelbaren Child-Nodes eines XML-Node aufgerufen werden. Wenn Sie jedoch dynamischen Zugriff auf tiefer gelegene Strukturen wie z.B. "Enkel" und "Urenkel" usw. benötigen, so gehen Sie vor, wie unten gezeigt.

 

1.Erstellen Sie ein neues Mapping.

2.Klicken Sie im Menü "Einfügen" auf XML-Schema/Datei einfügen und navigieren Sie zur XML-Instanzdatei (in diesem Beispiel die Datei Articles.xml aus dem Ordner <Dokumente>\Altova\MapForce2024\MapForceExamples\).

3.Klicken Sie mit der rechten Maustaste auf den Node Articles und wählen Sie den Kontextmenübefehl Child-Elemente mit dynamischem Namen anzeigen.

4.Wählen Sie im Dialogfeld "Einstellungen für dynamisch benannte Child-Elemente" xs:anyType aus.

5.Klicken Sie mit der rechten Maustaste auf den Node xs:anyType und wählen Sie erneut den Kontextmenübefehl Child-Elemente mit dynamischem Namen anzeigen.

6.Wählen Sie im Dialogfeld  "Einstellungen für dynamisch benannte Child-Elemente" text() aus.

mf_generic_grandchildren

Beachten Sie, dass die Komponente oben zwei element() Nodes enthält. Der zweite element()-Node ermöglicht dynamischen Zugriff auf die Enkel des Node <Articles> in der Instanz Articles.xml.

 

<?xml version="1.0" encoding="UTF-8"?>
<Articles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Articles.xsd">
  <Article>
    <Number>1</Number>
    <Name>T-Shirt</Name>
    <SinglePrice>25</SinglePrice>
  </Article>
  <Article>
    <Number>2</Number>
    <Name>Socks</Name>
    <SinglePrice>2.30</SinglePrice>
  </Article>
  <Article>
    <Number>3</Number>
    <Name>Pants</Name>
    <SinglePrice>34</SinglePrice>
  </Article>
  <Article>
    <Number>4</Number>
    <Name>Jacket</Name>
    <SinglePrice>57.50</SinglePrice>
  </Article>
</Articles>

Articles.xml

Um z.B. die Enkelelementnamen (Number, Name, SinglePrice) abzurufen, würden Sie eine Verbindung vom Node local-name() unterhalb des zweiten element() Node zu einem Zieldatenelement ziehen. Um die Enkelelementwerte (1, T-Shirt, 25) abzurufen, würden Sie eine Verbindung vom Node text() ziehen.

 

Zwar gilt dies nicht für dieses Beispiel, doch können Sie in realen Einsatzszenarien auch für jeden nachfolgenden xs:anyType Node den dynamischen Zugriff auf Node-Namen aktivieren, um noch tiefer gelegene Ebenen zu erreichen.

 

Beachten Sie bitte Folgendes:

 

Über die Schaltfläche btn_derived_type können Sie jeden abgeleiteten Typ aus dem aktuellen Schema auswählen und in einem separaten Node anzeigen. Dies ist nur dann nützlich, wenn Sie von oder auf abgeleitete Schematypen mappen müssen (siehe Abgeleitete XML-Schema-Typen).

Über die neben einem element () Node gelegene Schaltfläche Auswahl ändern ( mf_ic_change_selection ) rufen Sie das in diesem Kapitel beschriebene Dialogfeld "Einstellungen für dynamisch benannte Child-Elemente" auf.

Über die Schaltfläche Auswahl ändern ( mf_ic_change_selection ) neben dem xs:anyAttribute-Attribut können Sie jedes beliebige global im Schema definierte Attribut auswählen. Auf die gleiche Art können Sie über die Schaltfläche Auswahl ändern ( mf_ic_change_selection ) neben dem xs:any-Element jedes beliebige global im Schema definierte Element auswählen. Dies funktioniert auf dieselbe Art und Weise wie das Mappen von oder auf Schema-Wildcards (siehe auch Wildcards - xs:any / xs:anyAttribute). Vergewissern Sie sich bei Verwendung dieser Option, dass das ausgewählte Attribut oder Element gemäß dem Schema auf dieser Ebene auch wirklich zulässig ist.

© 2017-2023 Altova GmbH