Controlador de propiedad XPath arbitrario (ejemplo de BizTalk Server)
El controlador de propiedad XPath arbitrario (ejemplo de BizTalk Server) muestra cómo escribir un componente de canalización personalizado para promover propiedades específicas en un documento XML que se envía a BizTalk Server. Puede utilizar la funcionalidad contenida en el ejemplo para crear componentes de ensamblador y desensamblador normales personalizados para evaluar las expresiones XPath.
Descripción del ejemplo
El ejemplo incluye un documento XML de pedido de compra (PO) que se debe procesar, DocInstance.xml. El ejemplo realiza los siguientes pasos para procesar DocInstance.xml:
Un puerto de recepción de BizTalk Server recupera DocInstance.xml y un componente de canalización personalizado denominado controlador de propiedad XPath arbitrario lo procesa.
El componente de controlador de propiedades XPath arbitrario promueve todos los <elementos Price> y <Quantity> con una expresión XPath arbitraria, tal como se define en el esquema de pedido de compra. Además, la expresión XPath contiene la construcción de la posición que se va a usar con elementos secundarios ambiguos del elemento raíz del documento de pedido de compra.
El componente de controlador de propiedad XPath arbitrario determina el tipo de mensaje y lo promueve en el contexto del mensaje.
A continuación, el componente envía el documento XML con los elementos promocionados a una orquestación para su posterior procesamiento.
La orquestación obtiene acceso a los elementos promocionados del documento de pedido de compra y calcula el número total de elementos del pedido de compra.
La orquestación crea un nuevo documento de pedido de compra que contiene la información del pedido de compra original, así como el total actualizado.
El nuevo documento de pedido de compra se escribe en un archivo del directorio \Output.
Ubicación del ejemplo
<Ruta de acceso> de ejemplos\Pipelines\ArbitraryXPathPropertyHandler
En la tabla siguiente se enumeran los archivos del ejemplo y se describe su propósito.
Archivos | Descripción |
---|---|
ArbitraryXPathPropertyHandler.sln | Archivo de solución del componente de canalización personalizado. |
ArbitraryXPathPropertyHandler.resX | Archivo de recursos. |
ArbitraryXPathPropertyHandlerComp.cs | Implementación del componente principal. |
AssemblyInfo.cs | Información sobre el ensamblado. |
Cleanup.bat | Archivo de limpieza de ejemplo. |
PromotingMap.cs | Promoción de propiedades como implementación de asignación de tipos CLR nativos. |
PropertyAttributes.cs | Atributos personalizados, descriptor de propiedades e implementación de ICustomTypePropertyDescriptor. |
SchemaMap.cs | Asignación de esquemas del tipo de mensaje a IDocumentSpec para resolver la ambigüedad del esquema. |
Setup.bat | Componente de canalización de ejemplo de configuración y de versión de compilación. |
VirtualStream.cs | Implementación de secuencia virtual. |
SeekableReadOnlyStream.cs | Implementación de secuencia de sólo lectura en la que se pueden efectuar búsquedas. |
ArbitraryXPathSample.sln | Archivo de solución de orquestación de ejemplo. |
CalculateTotalAmount.odx | Orquestación de ejemplo. |
PODocument.xsd | Esquema del pedido de compra. |
DocInstance.xml | Instancia del pedido de compra de ejemplo. |
Crear e inicializar este ejemplo
Este ejemplo está diseñado para ejecutarse en un entorno de BizTalk Server con SQL Server en ejecución en la misma máquina. Si el entorno no coincide con esta configuración, debe modificar el controlador de propiedad XPath arbitrario (ejemplo de BizTalk Server) para elegir el equipo de servidor SQL Server correcto.
Importante
Setup.bat supone que el directorio de instalación de Microsoft Windows es C:\Windows. Si la instalación de Windows se encuentra en otro directorio, debe modificar el archivo ArbitraryXPathPropertyHandler.csproj para reflejar la ubicación del ensamblado Microsoft.BizTalk.Component.Utilities en la caché de ensamblados global. En el elemento Reference, cambie <SYSTEMROOT> a la ubicación donde está instalado Windows (por ejemplo, C:\WINNT\).
<Reference
Name = "Microsoft.BizTalk.Component.Utilities"
AssemblyName = "Microsoft.BizTalk.Component.Utilities"
HintPath = "<SYSTEMROOT>\assembly\GAC\Microsoft.BizTalk.Component.Utilities\3.0.1.0__31bf3856ad364e35\Microsoft.BizTalk.Component.Utilities.dll"
/>
Utilice el siguiente procedimiento para generar e inicializar el controlador de propiedad XPath arbitrario (ejemplo de BizTalk Server).
Para generar e inicializar el ejemplo
En una ventana de comandos, cambie los directorios (cd) a la siguiente carpeta:
<Ruta de acceso> de ejemplos\Pipelines\ArbitraryXPathPropertyHandler
Ejecute el archivo Setup.bat que realiza las acciones siguientes:
Genera el componente de canalización del controlador de propiedad XPath arbitrario.
Copia el componente de canalización compilado en el <directorio Ruta> de instalación\Componentes de canalización.
Crea los puertos de envío y recepción.
Crea los directorios de entrada y salida utilizados en el ejemplo.
Instala la orquestación de BizTalk Server de ejemplo ArbitraryXPathSample.
Enlaza los puertos en la orquestación de ejemplo.
Inicia la orquestación.
Nota
No se deben generar informes de errores durante la generación y la inicialización. En caso de que se produzca algún error, asegúrese de que tiene instalado todo el software necesario y que las herramientas de generación de Microsoft se encuentran disponibles en la ruta.
Nota
Para deshacer los cambios realizados por Setup.bat, primero debe detener y reiniciar la instancia de host desde la consola de administración de BizTalk Server. A continuación, ejecute Cleanup.bat. Debe ejecutar Cleanup.bat antes de ejecutar Setup.bat por segunda vez.
Ejecución del ejemplo
Utilice el siguiente procedimiento para ejecutar el controlador de propiedad XPath arbitrario (ejemplo de BizTalk Server).
Para ejecutar el ejemplo
Copie el archivo de pedido de compra (PO) DocInstance.xml en el directorio \Input. Un puerto de recepción recoge el archivo de pedido de compra y envía los datos XML al componente de canalización del controlador de propiedad Xpath arbitrario.
Vea el contenido del directorio \Output. Tenga en cuenta que se crea un archivo nuevo que contiene toda la información del archivo DocInstance.xml que ha copiado en el directorio \Input. La diferencia en el archivo es que ahora el <elemento TotalAmount> se ha rellenado con la cantidad total del pedido de compra.
Comentarios
Las expresiones XPath canónicas son expresiones simples como "/*[local-name()='element-name' y namespaceURI()='http://MyUri.org'']/*[local-name()='element-name']/@*[local-name='attribute-name']".
Una expresión XPath arbitraria puede ser tan compleja como "//element-name//*[local-name()='element-name' and position()=2]". Dado el caso, recibirá un error de tiempo de ejecución que indica que las expresiones XPath no canónicas no son compatibles con BizTalk Server si el esquema tiene un XPath no canónico utilizado en el cuerpo de XPath o en una propiedad de XPath. Una solución para admitir expresiones XPath arbitrarias es crear componentes de desensamblador y de ensamblador personalizados que admiten un cuerpo de XPath arbitrario, así como expresiones de propiedad de XPath arbitrarias.
En este ejemplo se usa la siguiente secuencia de pasos en el componente de canalización personalizado cuando se implementa IComponent.Execute :
Crea una secuencia virtual que permite efectuar búsquedas en la secuencia de parte del cuerpo del mensaje de entrada. (Puesto que es posible que el mensaje de entrada sea grande y la secuencia no permita efectuar búsquedas, debe tener un pequeño volumen de memoria y poder cambiar las posiciones de la secuencia).
Crea un nuevo mensaje saliente y una nueva parte del cuerpo para ello, asigna una secuencia virtual a la nueva parte del cuerpo y clona las propiedades de la parte del cuerpo y el contexto del mensaje.
Obtiene un esquema para el mensaje de entrada o se basa en los esquemas especificados durante el tiempo de diseño.
Carga la secuencia en una instancia de System.Xml. XmlDocument.
Inspecciona las propiedades promocionadas y los campos distinguidos, además de promoverlos o escribirlos en el contexto del mensaje saliente.
Devuelve el mensaje saliente.
Escribe el mensaje saliente en un archivo.