Altova MapForce 2024 Enterprise Edition

In diesem Beispiel wird beschrieben, wie Sie mit Hilfe einer rekursiven benutzerdefinierten Funktion nach Daten in einer XML-Quelldatei suchen. Um die rekursive benutzerdefinierte Funktion auszuprobieren, benötigen Sie das folgende Mapping: MapForceExamples\RecursiveDirectoryFilter.mfd. Im unten gezeigten Mapping erhält die benutzerdefinierte Funktion FilterDirectory Daten aus der Quelldatei Directory.xml und der einfachen Input-Komponente SearchFor, die die .xml-Erweiterung liefert. Nachdem die Daten von der benutzerdefinierten Funktion verarbeitet wurden, werden sie auf die Zieldatei gemappt.

 

Im Hauptmapping (siehe Abbildung unten) ist das allgemeine Mapping-Layout beschrieben. Wie die benutzerdefinierte Funktion die Daten verarbeitet, ist separat im Funktionsmapping definiert (siehe UDF-Implementierung weiter unten).

mf_udf_23

Aufgabenstellung

Ziel ist es, Dateien mit der Erweiterung .xml in der Ausgabe aufzulisten, wobei die gesamte Verzeichnisstruktur erhalten bleiben soll. In den folgenden Unterabschnitten wird das Mapping im Detail erläutert.

 

Quelldatei

Unten sehen Sie einen Ausschnitt aus der XML-Quelldatei (Directory.xml), die Informationen über Dateien und Verzeichnisse enthält. Beachten Sie, dass die Dateien in dieser Liste unterschiedliche Erweiterungen haben (z.B. .xml, .dtd, .sps). Gemäß dem Schema (Directory.xsd), kann das Element directory file- und directory-Children haben. Alle directory-Elemente sind rekursiv.

 

<directory name="ExampleSite">

 <file name="blocks.sps" size="7473"/>

 <file name="blocks.xml" size="670"/>

 <file name="block_file.xml" size="992"/>

 <file name="block_schema.xml" size="1170"/>

 <file name="contact.xml" size="453"/>

 <file name="dictionaries.xml" size="206"/>

 <file name="examplesite.dtd" size="230"/>

 <file name="examplesite.spp" size="1270"/>

 <file name="examplesite.sps" size="20968"/>

 ...

 <directory name="output">

         <file name="examplesite1.css" size="3174"/>

         <directory name="images">

                 <file name="blank.gif" size="88"/>

                 <file name="block_file.gif" size="13179"/>

                 <file name="block_schema.gif" size="9211"/>

                 <file name="nav_file.gif" size="60868"/>

                 <file name="nav_schema.gif" size="6002"/>

         </directory>

 </directory>

</directory>

 

Implementierung der benutzerdefinierten Funktion

Um die interne Implementierung der benutzerdefinierten Funktion zu sehen, doppelklicken Sie im Hauptmapping auf ihre Titelleiste. Die Funktion ist rekursiv, d.h. sie ruft sich selbst auf. Da die Funktion mit dem rekursiven Element directory verbunden ist, wird diese Funktion so oft aufgerufen, wie sich in der XML-Quellinstanz verschachtelte directory-Elemente befinden. Damit rekursive Aufrufe unterstützt werden, muss die Funktion regulär sein.

mf_udf_24

Die Implementierung der benutzerdefinierten Funktion erfolgt in zwei Phasen: (i) der Definition der Dateien und (ii) der Definition der zu durchsuchenden Verzeichnisse.

 

Definition der Dateien

Die Dateien werden von der benutzerdefinierten Funktion folgendermaßen verarbeitet: Die Funktion contains überprüft, ob der erste String (der Dateiname) den (von der einfachen Input-Komponente SearchFor) gelieferten Substring .xml enthält. Wenn das Ergebnis der Funktion true ist, wird der Dateiname mit einer .xml-Erweiterung in die Ausgabe geschrieben.

 

Verarbeitung von untergeordneten Verzeichnissen

Die untergeordneten Verzeichnisse des aktuellen Verzeichnisses werden als Input an die aktuelle benutzerdefinierte Funktion gesendet. Die benutzerdefinierte Funktion iteriert somit durch alle directory-Elemente und überprüft, ob Dateien mit der Erweiterung .xml vorhanden sind.

 

Ausgabe

Wenn Sie auf das Fenster Ausgabe klicken, werden nur Dateien mit der Erweiterung.xml angezeigt (siehe Codefragment unten).

 

<directory name="ExampleSite">

 <file name="blocks.xml" size="670"/>

 <file name="block_file.xml" size="992"/>

 <file name="block_schema.xml" size="1170"/>

 <file name="contact.xml" size="453"/>

 ...

 <directory name="output">

         <directory name="images"/>

 </directory>

</directory>

 

© 2018-2024 Altova GmbH