Pular para o conteúdo
Kitegra
← Voltar ao blog

Módulo deste artigo: Integration Flow Helper

XPath no SAP CPI a partir de um payload de exemplo: XML e JSON para XML

Escreva XPath para Content Modifier, Router, Filter e Splitter do SAP CPI a partir de um payload de exemplo: caminhos XML, namespaces e JSON via o elemento raiz do JSON to XML Converter.

XPath no SAP CPI a partir de um payload de exemplo: XML e JSON para XML

XPath é como o SAP CPI lê um valor de uma mensagem XML: um número de pedido para uma propriedade, um status para uma condição de Router, um nó repetido para um Splitter. O jeito mais rápido de escrevê-lo certo é partir de uma amostra real do payload, e não da descrição da interface.

Este artigo mostra onde o XPath é usado em um iFlow, como derivar caminhos de uma amostra XML, como funcionam os namespaces e como payloads JSON viram XML, incluindo por que seus caminhos começam com /root.

Onde o XPath é usado em um iFlow

  • Content Modifier: uma linha de header ou de propriedade com tipo de origem XPath lê um valor do corpo. O tipo de dado decide se você recebe texto, como java.lang.String, ou nós.
  • Router e Filter: condições do tipo XML são expressões XPath, por exemplo /Orders/Order/Status = 'OPEN'.
  • Splitter: a expressão XPath seleciona o nó que se repete, uma mensagem por nó.
  • Gather, Aggregator e Content Enricher: o XPath aponta para os nós a combinar, correlacionar ou enriquecer.

Todos eles rodam sobre o corpo como ele está naquele passo. Depois de um mapeamento ou conversor, os caminhos mudam junto com a estrutura.

De uma amostra XML para um XPath

Aqui está uma amostra pequena com dois 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 na amostra
/Orders/Order/IdTodos os IDs de pedido: 4711 e 4712
/Orders/Order[@status='OPEN']/IdOs IDs dos pedidos em aberto: 4711
/Orders/Order[1]/Customer/@idO ID do cliente do primeiro pedido: C-100
count(/Orders/Order)O número de pedidos: 2
/Orders/Order[Amount > 1000]Os pedidos acima de 1000

Um caminho que começa com / parte da raiz; //Id encontra elementos Id em qualquer lugar, o que é prático, mas mais lento em payloads grandes.

Namespaces

Se os elementos do payload estão em um namespace, um caminho sem prefixo não encontra nada. Declare um prefixo para cada namespace na Runtime Configuration do iFlow, em Namespace Mapping, no formato xmlns:ord=http://example.com/orders, e use-o em todos os passos: /ord:Orders/ord:Order/ord:Id.

O prefixo do seu mapeamento não precisa ser igual ao do payload; só a URI do namespace precisa coincidir. Um XPath que não retorna nada em um payload que você vê claramente costuma ser um Namespace Mapping que está faltando.

Payloads JSON: XPath via JSON to XML Converter

O XPath trabalha sobre XML, então uma mensagem JSON é convertida antes com o JSON to XML Converter. Um objeto JSON com vários membros não tem um único elemento raiz, por isso a opção Add XML Root Element do conversor o envolve em um, chamado root por padrão. Os caminhos então começam com /root, e cada item de um array vira um elemento repetido com o nome do 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

Se você der outro nome à raiz no conversor, mude o primeiro passo de cada caminho para combinar. Para voltar ao JSON depois dos passos com XPath, use o XML to JSON Converter.

Por que um XPath não retorna nada

  • Um namespace não declarado em Namespace Mapping, ou um caminho sem o prefixo.
  • Maiúsculas e minúsculas erradas: nomes de elementos e atributos no XPath as diferenciam.
  • Um caminho escrito para o payload de antes de um mapeamento ou conversor alterá-lo.
  • Um caminho JSON sem o passo /root, ou com o nome padrão depois que a raiz foi renomeada.
  • O tipo de dado errado em uma linha de Content Modifier: java.lang.String retorna texto, org.w3c.dom.NodeList retorna nós.

Vai montar um corpo com esses valores depois? O artigo sobre expressões Simple mostra como usar as propriedades que você acabou de ler, e o artigo sobre Postman e OpenAPI mostra como enviar um corpo JSON para uma API REST.

Como o Kitegra ajuda

A extensão de navegador Kitegra escreve os caminhos a partir da sua amostra. Forneça um payload de exemplo em XML ou JSON e ela sugere expressões XPath nas linhas XPath do Content Modifier, em Router, Filter, Splitter, Gather, Aggregator e Content Enricher. Para uma amostra JSON, os caminhos sugeridos começam na raiz do conversor, /root.

Os payloads de exemplo ficam no seu navegador: a Kitegra nunca os armazena. A extensão nunca salva, implanta nem edita o conteúdo de um iFlow, e o seu tenant só muda quando você clica em uma de quatro ações nomeadas, que podem ser desativadas.

Para ver o corpo que um passo XPath realmente recebe, rastreie a mensagem passo a passo.

Sem uma conta Kitegra, ela funciona em 5 iFlows por módulo. O plano Free cobre 50, o Starter 100 e o Pro 300; o Business não tem limite. Compare os planos.

Experimente no seu próximo iFlow

Veja o que o Kitegra faz no designer do SAP Integration Suite, ou confira-o ao lado das outras extensões do Chrome da Kitegra.

Perguntas frequentes

Como leio um valor de um XML para uma propriedade no SAP CPI?

Em um Content Modifier, adicione uma linha de exchange property com tipo de origem XPath, o caminho como valor de origem, por exemplo /Orders/Order/Id, e java.lang.String como tipo de dado.

Por que meu XPath não retorna nada?

As causas mais comuns são um namespace não declarado em Namespace Mapping, maiúsculas e minúsculas erradas no nome de um elemento, ou um caminho escrito para o payload de antes de um mapeamento alterá-lo.

Posso usar XPath em um payload JSON?

Não diretamente. Converta primeiro o JSON com o JSON to XML Converter e depois escreva o XPath sobre o XML convertido.

Por que os XPaths para JSON começam com /root?

O JSON to XML Converter adiciona um elemento raiz chamado root por padrão, porque um objeto JSON com vários membros não tem uma raiz única. Ajuste os caminhos se você renomeá-lo.

Como ficam os arrays JSON depois do JSON to XML Converter?

Cada item do array vira um elemento repetido com o nome do array, então items com duas entradas vira dois elementos items, lidos com /root/items.

Como divido uma mensagem por pedido com XPath?

Use um Splitter com o XPath do nó que se repete, por exemplo /Orders/Order. Cada pedido vira uma mensagem própria.

Trabalhe em iFlows sem sair do designer

Adicione o Kitegra ao Chrome ou ao Microsoft Edge. Comece grátis, sem precisar de conta.