Ejemplo: búsqueda recursiva

www.altova.com Imprimir este apartado Página anterior Subir un nivel Página siguiente

Inicio >  Funciones > Funciones definidas por el usuario >

Ejemplo: búsqueda recursiva

Este ejemplo ilustra una asignación que busca datos en un archivo XML de origen con la ayuda de una función recursiva definida por el usuario. El archivo de la asignación se puede encontrar en la ruta: <Documentos>\Altova\MapForce2019\MapForceExamples\RecursiveDirectoryFilter.mfd.

mf_udf_22

RecursiveDirectoryFilter.mfd

El archivo XML de origen contiene información sobre archivos y directorios, como se ve en el siguiente fragmento de código (del que se omiten algunos datos para simplificar).

 

<?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>

Archivo Source XML

Tanto el archivo XMl de origen como el de destino usan el mismo esquema, Directory.xsd. En un sistema de archivos un directorio puede contener un archivo u otro directorio, lo que también está reflejado en el esquema. Observe que el esquema indica que el elemento directory es recursivo (véase la línea <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

El requisito empresarial de la asignación es filtrar solo archivos con una extensión específica. Se debe conservar la estructura anidada de todos los directorios. Por ejemplo, si la extensión es ".xml", entonces la salida esperada (para el archivo XML de origen que hemos indicado antes) tendrá este aspecto:

 

<?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>

Salida XML esperada

En segundo lugar, los usuarios de la asignación deben poder dar la extensión del archivo como parámetro. Por defecto, si un usuario no da un valor de parámetro, la asignación filtrará los archivos que tengan la extensión .xml.

 

Para cumplir con los requisitos mencionados más arriba, la asignación contiene un parámetro de entrada simple, "SearchFor", que indica la extensión de archivo predeterminada mediante una constante de texto. Este parámetro es opcional (la casilla Requiere una conexión de entrada no está marcada en el cuadro de diálogo "Propiedades"):

mf_udf_23

Para más información sobre los parámetros de entrada, consulte el apartado Pasar parámetros a la asignación.

 

La siguiente asignación incluye una función definida por el usuario, "FilterDirectory". Esta función es recursiva, es decir que incluye una llamada a sí misma. Al estar conectada con el elemento recursivo directory, se llamará a esta función tantas veces como elementos directory haya anidados en la instancia XML de origen. Esta función se creó como de tipo estándar, no inline, para que admitiera llamadas recursivas (la opción Uso inline no está marcada en las propiedades de la función). Para ver las propiedades de la función, haga clic con el botón derecho en un área vacía de la asignación y seleccione Configurar asignación en el menú contextual (véase también Editing User-Defined Functions).

mf_udf_24

Como se ve en la imagen anterior, la función toma dos parámetros como entrada:

 

1. Un parámetro complejo, Directory, que define la estructura XML que se debe buscar (este parámetro es el "haystack").

2. Un parámetro de cadena, SearchFor, que indica la extensión de archivo que se debe buscar (este parámetro es el "needle").

 

En la asignación, haga doble clic en la barra del título de cualquiera de los parámetros de entrada o salida para ver su configuración.

 

La función también incluye un componente de filtro al que está conectada la función integrada de MapForce contains. La función contains devuelve true solo cuando el valor de búsqueda coincide con el atributo "nombre" (el nombre del archivo) en la estructura de origen. Un valor true indica al filtro que copie el elemento actual en el componente de salida; de lo contrario, este se omite. Para más información sobre filtros, consulte el apartado Filtros y condiciones.

 

Los archivos de entrada y de salida de la asignación, además del parámetro directory de la función (tanto de entrada como de salida), tienen todos el mismo esquema, Directory.xsd. Como MapForce ha detectado que todos estos tipos son asignables, el tipo de conexión entre los parámetros de entrada y la función es "Copia total" (véase el apartado Conexiones de copia total).

 

Ejecutar la asignación

Para obtener una vista previa de cómo se ejecutará la asignación en MapForce, haga clic en la pestaña Resultados.La asignación se ejecuta con el parámetro de entrada predeterminado "".xml"), por lo que obtiene solamente los resultados que coincidan con este criterio de búsqueda. Para indicar un criterio de búsqueda distinto, cambie la constante que está conectada al parámetro de entrada de ".xml" a ".sps", por ejemplo, y vuelva a ejecutar la asignación.


© 2019 Altova GmbH