Obtener acceso a determinado tipo de nodos
Como decíamos en el apartado anterior, Obtener acceso al nombre de los nodos, 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 el tiempo de ejecución de la asignación de datos, esto hace que el nombre de cada elemento secundario sea accesible a través del nodo node-name(), mientras que el valor lo es a través de un nodo de conversión de tipos especial. En la imagen siguiente, el nodo de conversión de tipos 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 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 de texto. Para ello, seleccione la casilla de verificación text() en el cuadro de diálogo anterior. En este caso, se crea un nodo text() en el componente cuando se cierra el cuadro de diálogo. Esta opción es adecuada si el contenido es de tipo simple (xs:int, xs:string, etc.) y se ilustra en el tema 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 resultar útil en asignaciones avanzadas (ver Acceder acceder a estructuras más profundas). Para ello, seleccione la casilla situada junto a 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. |
Acceder a estructuras más profundas
Es posible acceder a nodos en niveles más profundos del esquema que los secundarios inmediatos de un nodo. Esto es muy práctico si estamos trabajando en asignaciones avanzadas. En asignaciones simples, como la de Ejemplo: asignar nombres de elemento a valores de atributo, no necesita esta técnica porque la asignación solo 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.En el menú Insertar, haga clic en Insertar esquema o archivo XML y busque el archivo de instancia XML (en este ejemplo, el archivo Articles.xml de la carpeta <Documentos>\Altova\MapForce2026\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 nodo element() proporciona acceso dinámico a los nietos del nodo <Articles> en 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.
Nota:
•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 (ver 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.