32.2. XML DSL
32.2.1. 기본 표현식
XML DSL에서 Cryostat 표현식을 평가하려면 xpath
요소 내에 Cryostat 표현식을 배치합니다. Cryostat 표현식은 현재 In 메시지의 본문에 적용되고 XML 노드(또는 노드 세트)를 반환합니다. 일반적으로 반환된 XML 노드는 자동으로 문자열로 변환됩니다.
예를 들어 현재 In 메시지 본문에서 /person/name
요소의 내용을 추출하고 이를 사용하여 user
라는 헤더를 설정하려면 다음과 같은 경로를 정의할 수 있습니다.
<beans ...> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="queue:foo"/> <setHeader headerName="user"> <xpath>/person/name/text()</xpath> </setHeader> <to uri="direct:tie"/> </route> </camelContext> </beans>
결과를 특정 유형으로 변환하려면 resultType
특성을 Java 유형 이름으로 설정하여 결과 유형을 지정합니다(정규화된 형식 이름을 지정해야 함). 예를 들어 결과 유형이 java.lang.String
임을 명시적으로 지정하려면(여기서 java.lang.
접두사를 생략할 수 있습니다).
<xpath resultType="String">/person/name/text()</xpath>
32.2.2. 네임스페이스
요소가 하나 이상의 XML 스키마에 속하는 문서를 처리하는 경우 일반적으로 namespace URI를 접두사와 연결해야 합니다. 따라서 Cryostat 표현식에서 요소 이름을 모호하게 식별할 수 있습니다. 접두사를 네임스페이스 URI와 연결하는 데 표준 XML 메커니즘을 사용할 수 있습니다. 즉, 다음과 같은 속성을 설정할 수 있습니다. xmlns:Prefix="NamespaceURI"
.
예를 들어 접두사 cust
를 네임스페이스, http://acme.com/customer/record
와 연결한 다음 요소 /cust:person/cust:name
의 내용을 추출하려면 다음과 같은 경로를 정의할 수 있습니다.
<beans ...>
<camelContext xmlns="http://camel.apache.org/schema/spring"
xmlns:cust="http://acme.com/customer/record" >
<route>
<from uri="queue:foo"/>
<setHeader headerName="user">
<xpath>/cust:person/cust:name/text()</xpath>
</setHeader>
<to uri="direct:tie"/>
</route>
</camelContext>
</beans>
32.2.3. 네임스페이스 감사
Cryostat 표현식을 사용할 때 발생할 수 있는 가장 빈번한 문제 중 하나는 들어오는 메시지에 나타나는 네임스페이스와 Cryostat 표현식에 사용되는 네임스페이스 간에 불일치가 있다는 것입니다. 이러한 종류의 문제를 해결하기 위해 Cryostat 언어는 들어오는 모든 메시지의 모든 네임스페이스를 시스템 로그로 덤프하는 옵션을 지원합니다.
INFO
로그 수준에서 네임스페이스 로깅을 활성화하려면 다음과 같이 XML DSL에서 logNamespaces
옵션을 활성화합니다.
<xpath logNamespaces="true" resultType="String">/foo:person/@id</xpath>
또는 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]}