Beispiel: Rekursive Suche

www.altova.com Dieses Kapitel drucken Vorherige Seite Eine Ebene nach oben Nächste Seite

Startseite >  Funktionen > Benutzerdefinierte Funktionen >

Beispiel: Rekursive Suche

In diesem Beispiel wird ein Mapping beschrieben, in dem mit Hilfe einer rekursiven benutzerdefinierten Funktion nach Daten in einer XML-Quelldatei gesucht wird. Die Mapping-Datei steht unter dem folgenden Pfad zur Verfügung: <Dokumente>\Altova\MapForce2019\MapForceExamples\RecursiveDirectoryFilter.mfd.

mf_udf_22

RecursiveDirectoryFilter.mfd

Die XML-Quelldatei enthält Informationen über Dateien und Verzeichnisse (siehe Codefragment unten). Beachten Sie, dass der Einfachheit halber einige Daten im Codefragment weggelassen wurden.

 

<?xml version="1.0" encoding="UTF-8"?>
<directory name="Examples">
  <directory name="ExampleSite">
    <file name="blocks.sps" size="7473"/>    
    <file name="block_file.xml" size="992"/>
    <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"/>          
        </directory>
    </directory>
  </directory>  
</directory>

XML-Quelldatei

Sowohl die XML-Quelldatei als auch die XML-Zieldatei verwendet dasselbe Schema, Directory.xsd. Da ein Verzeichnis in einem Dateisystem entweder eine Datei oder ein weiteres Verzeichnis enthalten kann, ist dies auch im Schema so definiert. Beachten Sie, dass das Element directory im Schema als rekursiv definiert ist (siehe Zeile <xs:element ref="directory"/>).

 

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="directory">
    <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="file">
              <xs:complexType>
                <xs:attribute name="name" type="xs:string"/>
                <xs:attribute name="size" type="xs:unsignedLong"/>
              </xs:complexType>
          </xs:element>
          <xs:element ref="directory"/>
        </xs:choice>
        <xs:attribute name="name"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

Directory.xsd

Die Aufgabe des Mappings ist es, nur Dateien mit einer bestimmten Erweiterung herauszufiltern. Die verschachtelte Struktur aller Verzeichnisse muss erhalten bleiben. Wenn die Erweiterung z.B. ".xml" ist, sollte das erwartete Ergebnis (für das obige Codefragment der XML-Quelldatei) folgendermaßen aussehen:

 

<?xml version="1.0" encoding="UTF-8"?>
<directory name="Examples">
  <directory name="ExampleSite">
    <file name="block_file.xml" size="992"/>
    <directory name="output">
        <directory name="images"/>
    </directory>
  </directory>
</directory>

Erwartete XML-Ausgabe

Zweitens muss in der aufrufenden Komponente des Mappings die Dateierweiterung als Parameter angegeben werden können. Wenn kein Parameterwert angegeben wird, werden standardmäßig Dateien mit der Erweiterung .xml herausgefiltert.

 

Das Mapping enthält daher den einfachen Input-Parameter "SearchFor", der die Standarddateierweiterung in Form einer Textkonstante bereitstellt. Dieser Parameter ist optional (das Kontrollkästchen Input ist erforderlich im Dialogfeld "Eigenschaften" ist nicht aktiviert):

mf_udf_23

Nähere Informationen zu Input-Parametern finden Sie unter Bereitstellen von Parametern für das Mapping.

 

Das Weiteren enthält das Mapping die benutzerdefinierte Funktion "FilterDirectory". Diese 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, wurde diese Funktion als reguläre benutzerdefinierte Funktion und nicht als Inline-Funktion erstellt (Die Option Inline-Verwendung ist in den Eigenschaften der Funktion nicht aktiviert). Um die Eigenschaften der Funktion zu sehen, klicken Sie mit der rechten Maustaste auf einen leeren Bereich im Mapping und wählen Sie im Kontextmenü den Befehl Funktionseinstellungen, siehe auch Bearbeiten von benutzerdefinierten Funktionen.

mf_udf_24

Wie oben gezeigt, erhält die Funktion zwei Parameter als Input:

 

1. einen komplexen Parameter Directory, der die zu durchsuchende XML-Struktur definiert (dieser Parameter ist der "Heuhaufen").

2. einen String-Parameter SearchFor, der definiert, nach welcher Dateierweiterung gesucht werden soll (dieser Parameter ist die "Nadel").

 

Doppelklicken Sie auf die Titelleiste eines der Input- oder Output-Parameter im Mapping, um deren Einstellungen zu sehen.

 

Die Funktion enthält auch eine Filterkomponente, mit der die vordefinierte MapForce-Funktion contains verbunden ist. Die Funktion contains gibt nur dann true zurück, wenn der Suchwert mit dem "name"-Attribut (dem Dateinamen) in der Quellstruktur übereinstimmt. Beim Wert true kopiert der Filter das aktuelle Datenelement in die Ausgabekomponente. Andernfalls wird es übersprungen. Nähere Informationen zu Filtern finden Sie unter Filter und Bedingungen.

 

Die Quell- und Zieldatei des Mappings sowie der directory-Parameter (sowohl Input als auch Output) haben alle dasselbe Schema Directory.xsd. Da MapForce all diese Typen als zuweisungskompatibel erkannt hat, ist der Verbindungstyp zwischen den Input-Parametern und der Funktion "Alles kopieren", siehe "Alles kopieren"-Verbindungen.

 

Ausführen des Mappings

Um in MapForce eine Vorschau auf das Ergebnis der Mapping-Ausführung zu sehen, klicken Sie auf das Register Ausgabe. Das Mapping wird mit dem Standard-Input-Parameter (".xml") ausgeführt und ruft in der Folge nur die Ergebnisse ab, die diesem Suchkriterium entsprechen. Um ein anderes Suchkriterium anzugeben, ändern Sie die mit dem Input-Parameter verbundene Konstante von ".xml" in ".sps" und führen Sie das Mapping erneut aus.


© 2019 Altova GmbH