Obtener acceso a determinado tipo de nodos
Como decíamos en el apartado anterior, podemos acceder a todos los elementos secundarios de un nodo haciendo clic con el botón derecho en el nodo y seleccionando el comando Mostrar elementos secundarios con nombre dinámico en el menú contextual. En tiempo de ejecución esto permitirá acceder al nombre de cada elemento secundario a través del nodo node-name(), mientras que el valor estará disponible a través de un nodo de conversión de tipo especial. En la imagen siguiente podemos ver que el nodo de conversión de tipo es el nodo text().
Es importante señalar que el tipo de datos de cada elemento secundario no se conoce antes de que se ejecute la asignación. Además, el tipo de datos de cada elemento secundario puede ser distinto. Por ejemplo, un nodo product del archivo de instancia XML puede tener un elemento secundario id de tipo xs:integer y un elemento secundario size de tipo xs:string. Para poder acceder al contenido del nodo de un tipo específico el cuadro de diálogo (imagen siguiente) se abre cada vez que se habilita el acceso dinámico a los elementos secundarios de un nodo. Este cuadro de diálogo se puede abrir en cualquier momento con el botón Cambiar selección situado junto al nodo element().
Cuadro de diálogo "Configuración de secundarios con nombre dinámico"
Para acceder al contenido de cada elemento en tiempo de ejecución tenemos varias opciones:
1.Acceder al contenido como cadena: marque la casilla text() del cuadro de diálogo. En este caso, se crea un nodo text() en el componente cuando se cierra el cuadro de diálogo. Esta opción es la más adecuada si el contenido es de tipo simple (xs:int, xs:string, etc.) y se describe en el apartado Ejemplo: asignar nombres de elemento a valores de atributo. Recuerde que el nodo text() solamente aparece si un nodo secundario del nodo actual puede contener texto.
2.Acceder al contenido como cierto tipo complejo permitido por el esquema. Cuando el esquema permite para el nodo seleccionado tipos complejos personalizados definidos globalmente, éstos también estarán disponibles en el cuadro de diálogo y podremos marcar sus casillas. En la imagen anterior, por ejemplo, no hay tipos complejos definidos globalmente por el esquema así que no hay ninguno en el cuadro de diálogo.
3.Acceder al contenido como cualquier tipo. Esto puede ser muy práctico en asignaciones de datos complejas y se consigue marcando la casilla de xs:anyType.
Debe tener en cuenta que en tiempo de ejecución MapForce no dispone de información (a través del nodo de conversión de tipo) sobre el tipo real del nodo de instancia. Por tanto, su asignación debe acceder al contenido del nodo usando el tipo correcto. Por ejemplo, si se espera que el nodo de una instancia XML de origen tenga nodos secundarios de varios tipos complejos, deberá hacer lo siguiente: a) Asignar al nodo de conversión de tipo el tipo complejo que debe corresponderle. b) Agregar un filtro para leer de la instancia solamente el tipo complejo que debe corresponder.
Para más información sobre los filtros consulte Filtros y condiciones. |
Acceder a estructuras más profundas
En asignaciones más complejas es posible acceder a nodos de niveles más profundos del esquema que el nivel de secundarios inmediatos de un nodo. En las asignaciones más sencillas como las del apartado Ejemplo: asignar nombres de elemento a valores de atributo esta técnica no es necesaria porque la asignación sólo accede a los secundarios inmediatos de un nodo XML. Sin embargo, cuando lo necesite también podrá acceder de forma dinámica a estructuras más profundas (p.ej. a nietos, bisnietos, etc.) si sigue estos pasos:
1.Cree una asignación nueva.
2.Seleccione el comando de menú Insertar | Archivo o esquema XML y navegue hasta el archivo XML de instancia (p.ej. Articles.xml de la carpeta <Documentos>\Altova\MapForce2024\MapForceExamples\Tutorial\).
3.Haga clic con el botón derecho en el nodo Articles y seleccione Mostrar elementos secundarios con nombre dinámico en el menú contextual.
4.Marque la casilla xs:anyType en el cuadro de diálogo "Configuración de secundarios con nombre dinámico".
5.Haga clic con el botón derecho en el nodo xs:anyType y seleccione otra vez Mostrar elementos secundarios con nombre dinámico en el menú contextual.
6.Marque la casilla text() en el cuadro de diálogo "Configuración de secundarios con nombre dinámico".
En la imagen puede ver que el componente tiene dos nodos element(). El segundo de ellos ofrece acceso dinámico a los nietos del nodo <Articles> de la instancia Articles.xml.
<?xml version="1.0" encoding="UTF-8"?> |
Articles.xml
Por ejemplo, para obtener los nombres de elementos nietos (Number, Name, SinglePrice) debemos dibujar una conexión entre el nodo local-name() del segundo nodo element() y un elemento de destino. Igualmente para obtener los valores de elementos nietos (1, T-Shirt, 25), debemos dibujar una conexión desde el nodo text().
Aunque en este ejemplo no es relevante, MapForce ofrece la posibilidad de seguir habilitando nombres de nodo dinámico para los siguientes nodos xs:anyType y así poder alcanzar niveles aún más profundos de la estructura.
Debe tener en cuenta que:
•El botón sirve para seleccionar cualquier tipo derivado del esquema actual y mostrarlo en un nodo independiente. Esto puede ser práctico a la hora de crear asignaciones entre tipos de esquema derivados (véase Tipos XML Schema derivados).
•El botón Cambiar selección situado junto a un nodo element() abre el cuadro de diálogo "Configuración de secundarios con nombre dinámico".
•El botón Cambiar selección situado junto a xs:anyAttribute permite seleccionar cualquier atributo definido globalmente en el esquema. Igualmente el botón Cambiar selección
situado junto al elemento xs:any permite seleccionar cualquier elemento definido globalmente en el esquema. Se trata del mismo funcionamiento de las asignaciones de comodines de esquema (véase Comodines: xs:any / xs:anyAttribute). Si usa esta opción, asegúrese de que el esquema permite que el atributo o elemento exista de verdad.