Ir al contenido
Kitegra
← Volver al blog

Módulo de este artículo: Integration Flow Helper

XPath en SAP CPI a partir de un payload de ejemplo: XML y JSON a XML

Escribe XPath para Content Modifier, Router, Filter y Splitter de SAP CPI desde un payload de ejemplo: rutas XML, namespaces y JSON a través del elemento raíz del JSON to XML Converter.

XPath en SAP CPI a partir de un payload de ejemplo: XML y JSON a XML

XPath es la forma en que SAP CPI lee un valor de un mensaje XML: un número de pedido para una propiedad, un estado para una condición de Router, un nodo que se repite para un Splitter. La forma más rápida de escribirlo bien es partir de una muestra real del payload, no de la descripción de la interfaz.

Este artículo cubre dónde se usa XPath en un iFlow, cómo deducir rutas de una muestra XML, cómo funcionan los namespaces y cómo los payloads JSON se convierten en XML, incluido por qué sus rutas empiezan con /root.

Dónde se usa XPath en un iFlow

  • Content Modifier: una fila de header o de propiedad con tipo de origen XPath lee un valor del cuerpo. El tipo de dato decide si obtienes texto, como java.lang.String, o nodos.
  • Router y Filter: las condiciones de tipo XML son expresiones XPath, por ejemplo /Orders/Order/Status = 'OPEN'.
  • Splitter: la expresión XPath selecciona el nodo que se repite, un mensaje por nodo.
  • Gather, Aggregator y Content Enricher: XPath apunta a los nodos que se combinan, se correlacionan o se enriquecen.

Todos ellos se ejecutan sobre el cuerpo tal como está en ese paso. Después de un mapeo o un convertidor, las rutas cambian con la estructura.

De una muestra XML a un XPath

Esta es una muestra pequeña con dos pedidos:

<Orders>
  <Order status="OPEN">
    <Id>4711</Id>
    <Customer id="C-100">ACME</Customer>
    <Amount currency="EUR">1250.00</Amount>
  </Order>
  <Order status="CLOSED">
    <Id>4712</Id>
    <Customer id="C-200">Globex</Customer>
    <Amount currency="EUR">80.00</Amount>
  </Order>
</Orders>
XPathResultado sobre la muestra
/Orders/Order/IdTodos los IDs de pedido: 4711 y 4712
/Orders/Order[@status='OPEN']/IdLos IDs de los pedidos abiertos: 4711
/Orders/Order[1]/Customer/@idEl ID de cliente del primer pedido: C-100
count(/Orders/Order)El número de pedidos: 2
/Orders/Order[Amount > 1000]Los pedidos de más de 1000

Una ruta que empieza con / parte de la raíz; //Id encuentra elementos Id en cualquier lugar, lo que es cómodo pero más lento en payloads grandes.

Namespaces

Si los elementos del payload están en un namespace, una ruta sin prefijo no encuentra nada. Declara un prefijo para cada namespace en la Runtime Configuration del iFlow, en Namespace Mapping, con la forma xmlns:ord=http://example.com/orders, y úsalo en cada paso: /ord:Orders/ord:Order/ord:Id.

El prefijo de tu mapeo no tiene que coincidir con el del payload; solo debe coincidir la URI del namespace. Un XPath que no devuelve nada sobre un payload que ves con claridad suele deberse a un Namespace Mapping que falta.

Payloads JSON: XPath a través del JSON to XML Converter

XPath trabaja sobre XML, así que un mensaje JSON se convierte primero con el JSON to XML Converter. Un objeto JSON con varios miembros no tiene un único elemento raíz, así que la opción Add XML Root Element del convertidor lo envuelve en uno, llamado root por defecto. Las rutas empiezan entonces con /root, y cada elemento de un array se convierte en un elemento repetido con el nombre del array:

{
  "orderId": "4711",
  "customer": { "id": "C-100", "name": "ACME" },
  "items": [
    { "sku": "A-1", "qty": 2 },
    { "sku": "B-7", "qty": 1 }
  ]
}

JSON to XML Converter (root element: root)

<root>
  <orderId>4711</orderId>
  <customer><id>C-100</id><name>ACME</name></customer>
  <items><sku>A-1</sku><qty>2</qty></items>
  <items><sku>B-7</sku><qty>1</qty></items>
</root>

/root/orderId              4711
/root/customer/name        ACME
/root/items/sku            A-1, B-7
/root/items[qty > 1]/sku   A-1

Si le das otro nombre a la raíz en el convertidor, cambia el primer paso de cada ruta para que coincida. Para volver a JSON después de los pasos con XPath, usa el XML to JSON Converter.

Por qué un XPath no devuelve nada

  • Un namespace que no está declarado en Namespace Mapping, o una ruta sin su prefijo.
  • Mayúsculas y minúsculas equivocadas: en XPath, los nombres de elementos y atributos las distinguen.
  • Una ruta escrita para el payload de antes de que un mapeo o un convertidor lo cambiara.
  • Una ruta JSON sin el paso /root, o con el nombre predeterminado después de cambiar el nombre de la raíz.
  • El tipo de dato equivocado en una fila de Content Modifier: java.lang.String devuelve texto, org.w3c.dom.NodeList devuelve nodos.

¿Vas a armar un cuerpo con esos valores después? El artículo sobre expresiones Simple muestra cómo usar las propiedades que acabas de leer, y el artículo sobre Postman y OpenAPI muestra cómo enviar un cuerpo JSON a una API REST.

Cómo ayuda Kitegra

La extensión de navegador Kitegra escribe las rutas a partir de tu muestra. Dale un payload de ejemplo en XML o JSON y te sugiere expresiones XPath en las filas XPath de Content Modifier, Router, Filter, Splitter, Gather, Aggregator y Content Enricher. Para una muestra JSON, las rutas sugeridas empiezan en la raíz del convertidor, /root.

Los payloads de ejemplo se quedan en tu navegador: Kitegra nunca los guarda. La extensión nunca guarda, despliega ni edita el contenido de un iFlow, y tu tenant solo cambia cuando haces clic en una de cuatro acciones con nombre, que se pueden desactivar.

Para ver el cuerpo que recibe realmente un paso XPath, traza el mensaje paso a paso.

Sin una cuenta de Kitegra funciona en 5 iFlows por módulo. El plan Free cubre 50, Starter 100 y Pro 300; Business no tiene límite. Compara los planes.

Pruébalo en tu próximo iFlow

Descubre lo que hace Kitegra en el diseñador de SAP Integration Suite, o míralo junto a las demás extensiones de Chrome de Kitegra.

Preguntas frecuentes

¿Cómo leo un valor de un XML en una propiedad en SAP CPI?

En un Content Modifier, agrega una fila de exchange property con tipo de origen XPath, la ruta como valor de origen, por ejemplo /Orders/Order/Id, y java.lang.String como tipo de dato.

¿Por qué mi XPath no devuelve nada?

Las causas más comunes son un namespace no declarado en Namespace Mapping, mayúsculas y minúsculas equivocadas en el nombre de un elemento, o una ruta escrita para el payload de antes de que un mapeo lo cambiara.

¿Puedo usar XPath sobre un payload JSON?

No directamente. Convierte primero el JSON con el JSON to XML Converter y luego escribe el XPath sobre el XML convertido.

¿Por qué los XPath para JSON empiezan con /root?

El JSON to XML Converter agrega un elemento raíz llamado root por defecto, porque un objeto JSON con varios miembros no tiene una única raíz. Cambia las rutas si le pones otro nombre.

¿Cómo quedan los arrays JSON después del JSON to XML Converter?

Cada elemento del array se convierte en un elemento repetido con el nombre del array, así que items con dos entradas se convierte en dos elementos items, que se leen con /root/items.

¿Cómo divido un mensaje por pedido con XPath?

Usa un Splitter con el XPath del nodo que se repite, por ejemplo /Orders/Order. Cada pedido se convierte en un mensaje propio.

Trabaja en iFlows sin salir del diseñador

Agrega Kitegra a Chrome o Microsoft Edge. Empieza gratis, sin necesidad de cuenta.