Ejemplo: búsqueda recursiva
En esta sección explicamos cómo realizar búsquedas recursivas de datos en un archivo XML de origen con ayuda de las funciones definidas por el usuario. Para probar la búsqueda recursiva de la función definida por el usuario necesita esta asignación: MapForceExamples\RecursiveDirectoryFilter.mfd. En la asignación siguiente la función definida por el usuario FilterDirectory recibe datos del archivo de origen Directory.xml y del componente de entrada simple SearchFor que suministra la extensión .xml. Una vez la función ha procesado los datos, se asigna al archivo de destino.
La asignación principal (imagen siguiente) describe el diseño general de la asignación. La forma en que la función definida por el usuario procesa los datos se define aparte, en la asignación de la función (consulte más abajo Implementación de de funciones definidas por el usuario).
Objetivo
Nuestro objetivo es hacer una lista de los archivos con la extensión .xml en los resultados mientras conservamos la toda la estructura del directorio. A continuación explicamos en detalle el proceso de asignación.
Archivo de origen
Más abajo puede ver un extracto del archivo XML de origen (Directory.xml) que contiene información sobre los archivos y directorios. Observe que los archivos de esta lista tienen extensiones distintas (e.g., .xml, .dtd, .sps). Según el esquema (Directory.xsd), el elemento directory puede tener descendientes file y directory. Todos los elementos directory son recursivos.
<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>
Implementación de funciones definidas por el usuario
Para ver la implementación interna de la función definida por el usuario haga doble clic en su encabezado en la asignación principal. La función definida por el usuario es recursiva, es decir, se llama a sí misma. Al estar conectada al elemento recursivo directory, se llama a esta función tantas veces como elementos anidados directory haya en la instancia XML de origen. Para que admita llamadas recursivas, la función debe ser estándar.
La implementación de la función definida por el usuario consiste en dos partes: (i) definir los archivos y (ii) definir el directorio en que se realiza la búsqueda.
Definir archivos
Así es como la función definida por el usuario procesa los archivos: La función contains comprueba si la primera cadena (el nombre del archivo) contiene la subcadena .xml (dada por el componente de entrada simple SearchFor). Si la función devuelve true, se escribe en el resultado el nombre del archivo con la extensión .xml.
Procesar directorios descendientes
Los directorios descendientes del directorio actual se envían como entrada a la función definida por el usuario actual. Por tanto, esa función va comprobando si existen archivos con la extensión .xml en todos los elementos directory.
Resultados
Al hacer clic en el panel Resultados, MapForce muestra solamente los archivos que tienen la extensión .xml (véase el extracto más abajo).
<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>