본문으로 건너뛰기
← 블로그로 돌아가기

이 글의 모듈: Integration Flow Helper

샘플 페이로드로 작성하는 SAP CPI XPath: XML과 JSON에서 XML로

샘플 페이로드로 SAP CPI Content Modifier, Router, Filter, Splitter용 XPath 작성하기: XML 경로, 네임스페이스, JSON to XML Converter 루트 요소를 거친 JSON.

샘플 페이로드로 작성하는 SAP CPI XPath: XML과 JSON에서 XML로

XPath는 SAP CPI가 XML 메시지에서 값을 읽는 방법입니다. 속성에 넣을 주문 번호, Router 조건에 쓸 상태, Splitter에서 쓸 반복 노드 등이 그 예입니다. XPath를 가장 빨리 제대로 쓰는 방법은 인터페이스 설명이 아니라 실제 페이로드 샘플에서 시작하는 것입니다.

이 글에서는 iFlow에서 XPath를 쓰는 위치, XML 샘플에서 경로를 도출하는 방법, 네임스페이스의 동작 방식, 그리고 JSON 페이로드가 XML로 변환되는 방식과 그 경로가 /root로 시작하는 이유를 다룹니다.

iFlow에서 XPath를 쓰는 위치

  • Content Modifier: 소스 유형이 XPath인 header 행이나 속성 행이 본문에서 값을 읽습니다. 데이터 유형에 따라 java.lang.String 같은 텍스트를 얻을지, 노드를 얻을지가 정해집니다.
  • Router와 Filter: 유형이 XML인 조건은 XPath 표현식입니다. 예: /Orders/Order/Status = 'OPEN'.
  • Splitter: XPath 표현식으로 반복 노드를 선택하며, 노드마다 메시지 하나가 만들어집니다.
  • Gather, Aggregator, Content Enricher: XPath로 결합, 상관 연결, 보강할 노드를 가리킵니다.

이들은 모두 그 단계 시점의 본문을 대상으로 실행됩니다. 매핑이나 변환기를 거친 뒤에는 구조와 함께 경로도 바뀝니다.

XML 샘플에서 XPath로

다음은 주문 두 건이 들어 있는 작은 샘플입니다.

<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>
XPath샘플에 대한 결과
/Orders/Order/Id모든 주문 ID: 4711과 4712
/Orders/Order[@status='OPEN']/Id미결 주문의 ID: 4711
/Orders/Order[1]/Customer/@id첫 번째 주문의 고객 ID: C-100
count(/Orders/Order)주문 수: 2
/Orders/Order[Amount > 1000]1000을 넘는 주문

/로 시작하는 경로는 루트에서 시작합니다. //Id는 어디에 있든 Id 요소를 찾아 주어 편리하지만, 큰 페이로드에서는 더 느립니다.

네임스페이스

페이로드의 요소가 네임스페이스에 속해 있으면 접두사 없는 경로로는 아무것도 찾지 못합니다. iFlow의 Runtime Configuration에 있는 Namespace Mapping에서 각 네임스페이스의 접두사를 xmlns:ord=http://example.com/orders 형식으로 선언하고, 모든 단계에서 사용하세요: /ord:Orders/ord:Order/ord:Id.

매핑의 접두사가 페이로드의 접두사와 같을 필요는 없으며, 네임스페이스 URI만 일치하면 됩니다. 눈으로 분명히 보이는 페이로드에서 XPath가 아무것도 반환하지 않는다면, 대개 Namespace Mapping이 빠진 것입니다.

JSON 페이로드: JSON to XML Converter를 거쳐 XPath 사용하기

XPath는 XML에서 동작하므로 JSON 메시지는 먼저 JSON to XML Converter로 변환합니다. 멤버가 여러 개인 JSON 객체에는 단일 루트 요소가 없기 때문에, 변환기의 Add XML Root Element 옵션이 이를 루트 요소 하나로 감쌉니다. 기본 이름은 root입니다. 그래서 경로는 /root로 시작하고, 배열의 각 항목은 배열 이름을 가진 반복 요소가 됩니다.

{
  "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

변환기에서 루트에 다른 이름을 지정했다면 모든 경로의 첫 단계를 그에 맞게 바꾸세요. XPath 단계 이후 다시 JSON으로 되돌리려면 XML to JSON Converter를 사용하세요.

XPath가 아무것도 반환하지 않는 이유

  • 네임스페이스가 Namespace Mapping에 선언되지 않았거나, 경로에 접두사가 없는 경우.
  • 대소문자 오류: XPath에서 요소 이름과 어트리뷰트 이름은 대소문자를 구분합니다.
  • 매핑이나 변환기가 바꾸기 전의 페이로드를 기준으로 작성한 경로.
  • JSON 경로에 /root 단계가 없거나, 루트 이름을 바꾼 뒤에도 기본 이름을 쓰는 경우.
  • Content Modifier 행의 데이터 유형 오류: java.lang.String은 텍스트를, org.w3c.dom.NodeList는 노드를 반환합니다.

읽은 값을 나중에 본문에 넣을 건가요? Simple 표현식 글에서 방금 읽은 속성을 사용하는 방법을, Postman과 OpenAPI 글에서 JSON 본문을 REST API로 보내는 방법을 설명합니다.

Kitegra가 도와주는 방법

브라우저 확장 프로그램 Kitegra는 샘플을 바탕으로 경로를 작성해 줍니다. XML 또는 JSON 샘플 페이로드를 제공하면 Content Modifier의 XPath 행과 Router, Filter, Splitter, Gather, Aggregator, Content Enricher에서 XPath 표현식을 제안합니다. JSON 샘플의 경우 제안되는 경로는 변환기의 루트인 /root에서 시작합니다.

샘플 페이로드는 브라우저 안에만 머뭅니다. Kitegra는 이를 절대 저장하지 않습니다. 확장 프로그램은 iFlow의 내용을 저장, 배포, 편집하지 않으며, tenant는 이름이 정해진 네 가지 작업 중 하나를 클릭할 때만 바뀝니다. 이 작업들은 끌 수 있습니다.

XPath 단계가 실제로 받는 본문을 보려면 메시지를 단계별로 트레이스해 보세요.

Kitegra 계정이 없어도 모듈당 5개 iFlow에서 사용할 수 있습니다. Free 요금제는 50개, Starter는 100개, Pro는 300개까지 지원하며 Business는 제한이 없습니다. 요금제 비교하기.

다음 iFlow에서 사용해 보세요

Kitegra가 SAP Integration Suite 디자이너에서 무엇을 하는지 읽어 보거나, Kitegra의 다른 Chrome 확장 프로그램과 함께 살펴보세요.

자주 묻는 질문

SAP CPI에서 XML의 값을 속성으로 읽으려면 어떻게 하나요?

Content Modifier에 exchange property 행을 추가하고, 소스 유형은 XPath, 소스 값은 경로(예: /Orders/Order/Id), 데이터 유형은 java.lang.String으로 지정하세요.

XPath가 아무것도 반환하지 않는 이유는 무엇인가요?

가장 흔한 원인은 Namespace Mapping에 선언되지 않은 네임스페이스, 요소 이름의 대소문자 오류, 또는 매핑이 바꾸기 전의 페이로드를 기준으로 작성한 경로입니다.

JSON 페이로드에 XPath를 쓸 수 있나요?

직접은 안 됩니다. 먼저 JSON to XML Converter로 JSON을 변환한 다음, 변환된 XML을 대상으로 XPath를 작성하세요.

JSON용 XPath가 /root로 시작하는 이유는 무엇인가요?

멤버가 여러 개인 JSON 객체에는 단일 루트가 없기 때문에, JSON to XML Converter가 기본적으로 root라는 루트 요소를 추가합니다. 이름을 바꿨다면 경로도 바꾸세요.

JSON 배열은 JSON to XML Converter를 거친 뒤 어떻게 되나요?

배열의 각 항목이 배열 이름을 가진 반복 요소가 됩니다. 따라서 항목이 두 개인 items는 items 요소 두 개가 되고, /root/items로 읽습니다.

XPath로 주문별로 메시지를 나누려면 어떻게 하나요?

반복 노드의 XPath를 지정한 Splitter를 사용하세요. 예: /Orders/Order. 각 주문이 별도의 메시지가 됩니다.

디자이너를 떠나지 않고 iFlow 작업하기

Kitegra을 Chrome 또는 Microsoft Edge에 추가하세요. 계정 없이 무료로 시작할 수 있습니다.