32장. Cryostat 언어

초록

XML 메시지를 처리할 때 Cryostat 언어를 사용하면 메시지의 Document Object Model(DOM)에서 작동하는 Cryostat 표현식을 지정하여 메시지의 일부를 선택할 수 있습니다. Cryostat 서술자를 정의하여 요소 또는 속성의 내용을 테스트할 수도 있습니다.

32.1. Java DSL

32.1.1. 기본 표현식

xpath("Expression ")을 사용하여 현재 교환에 대해 Cryostat 표현식을 평가할 수 있습니다(여기서 the Cryostat 표현식은 현재 In 메시지의 본문에 적용됨). xpath() 표현식의 결과는 XML 노드(또는 둘 이상의 노드가 일치하는 경우 노드 세트)입니다.

예를 들어 현재 In 메시지 본문에서 /person/name 요소의 내용을 추출하고 이를 사용하여 user 라는 헤더를 설정하려면 다음과 같은 경로를 정의할 수 있습니다.

from("queue:foo")
    .setHeader("user", xpath("/person/name/text()"))
    .to("direct:tie");

xpath()setHeader() 에 대한 인수로 지정하는 대신 fluent builder xpath() 명령 Cryostat- case를 사용할 수 있습니다.

from("queue:foo")
    .setHeader("user").xpath("/person/name/text()")
    .to("direct:tie");

결과를 특정 유형으로 변환하려면 xpath() 의 두 번째 인수로 결과 유형을 지정합니다. 예를 들어 결과 유형이 문자열 임을 명시적으로 지정하려면 다음을 수행합니다.

xpath("/person/name/text()", String.class)

32.1.2. 네임스페이스

일반적으로 XML 요소는 네임스페이스 URI로 식별되는 스키마에 속합니다. 이와 같은 문서를 처리할 때 Cryostat 표현식에서 요소 이름을 명확하게 식별할 수 있도록 네임스페이스 URI를 접두사와 연결해야 합니다. Apache Camel은 네임스페이스와 접두사 간 연결을 정의할 수 있는 Helper 클래스 org.apache.camel.builder.xml.Namespaces 를 제공합니다.

예를 들어 접두사 cust 를 네임스페이스, http://acme.com/customer/record 와 연결한 다음 요소 /cust:person/cust:name 의 내용을 추출하려면 다음과 같은 경로를 정의할 수 있습니다.

import org.apache.camel.builder.xml.Namespaces;
...
Namespaces ns = new Namespaces("cust", "http://acme.com/customer/record");

from("queue:foo")
    .setHeader("user", xpath("/cust:person/cust:name/text()", ns))
    .to("direct:tie");

Namespaces 오브젝트 ns 를 추가 인수로 전달하여 xpath() 표현식 빌더에서 네임스페이스 정의를 사용할 수 있도록 하는 위치. 여러 네임스페이스를 정의해야 하는 경우 다음과 같이 Namespace.add() 메서드를 사용합니다.

import org.apache.camel.builder.xml.Namespaces;
...
Namespaces ns = new Namespaces("cust", "http://acme.com/customer/record");
ns.add("inv", "http://acme.com/invoice");
ns.add("xsi", "http://www.w3.org/2001/XMLSchema-instance");

결과 유형을 지정하고 네임스페이스를 정의해야 하는 경우 다음과 같이 3 단계의 xpath() 형식을 사용할 수 있습니다.

xpath("/person/name/text()", String.class, ns)

32.1.3. 네임스페이스 감사

Cryostat 표현식을 사용할 때 발생할 수 있는 가장 빈번한 문제 중 하나는 들어오는 메시지에 나타나는 네임스페이스와 Cryostat 표현식에 사용되는 네임스페이스 간에 불일치가 있다는 것입니다. 이러한 종류의 문제를 해결하기 위해 Cryostat 언어는 들어오는 모든 메시지의 모든 네임스페이스를 시스템 로그로 덤프하는 옵션을 지원합니다.

INFO 로그 수준에서 네임스페이스 로깅을 활성화하려면 다음과 같이 Java DSL에서 logNamespaces 옵션을 활성화합니다.

xpath("/foo:person/@id", String.class).logNamespaces()

또는 org.apache.camel.builder.xml.XPathBuilder 로거에서 TRACE 수준 로깅을 활성화하도록 로깅 시스템을 구성할 수 있습니다.

네임스페이스 로깅이 활성화되면 처리된 각 메시지에 대해 다음과 같은 로그 메시지가 표시됩니다.

2012-01-16 13:23:45,878 [stSaxonWithFlag] INFO  XPathBuilder  -
Namespaces discovered in message: {xmlns:a=[http://apache.org/camel],
DEFAULT=[http://apache.org/default],
xmlns:b=[http://apache.org/camelA, http://apache.org/camelB]}