Hi,

You should be able to set the xpath expression result like this
.setHeader("hasMore", 
ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns1:hasMore/text()",
 Integer.class))

The you don't need to header in you processor. 

-- 
Willem Jiang

Red Hat, Inc.
FuseSource is now part of Red Hat
Web: http://www.fusesource.com | http://www.redhat.com
Blog: http://willemjiang.blogspot.com (http://willemjiang.blogspot.com/) 
(English)
          http://jnn.javaeye.com (http://jnn.javaeye.com/) (Chinese)
Twitter: willemjiang 
Weibo: willemjiang





On Tuesday, December 4, 2012 at 11:00 AM, Jason Chaffee wrote:

> Currently, I am using Xpath to read some elements from the body that are 
> integers. Later in the process, I need to use those integers in a scripting 
> language to do some comparisons and arithmetic. The problem I am seeing is 
> that when I set the header it is a NodeList object instead of the integer or 
> string from the XML, this causes the logic in the javascript to fail. I was 
> able to work around the issue, but accessing the NodeList in a Processor and 
> converting it and saving it back in the header. However, this seems very 
> clunky and an extra step that I would expect to have to do.
> 
> Code example is below, is there a better or cleaner way?
> 
> val ns: Namespaces = new Namespaces("soapenv", 
> "http://schemas.xmlsoap.org/soap/envelope/";)
> ns.add("ns1", "https://foobar.com/item/v2";)
> 
> 
> from("seda:Soap")
> .routeId("Soap")
> .setHeader("SOAPAction", constant("\"getItems\""))
> .to("cxf://" + savingsUri.toString())
> .unmarshal().string("UTF-8")
> .setHeader("hasMore", 
> ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns1:hasMore/text()"))
> .setHeader("recordsReturned", 
> ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns1:recordsReturned/text()"))
> .setHeader("totalRecordsAvailable", 
> ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns1:totalRecordsAvailable/text()"))
> .process(new Processor {
> override def process(exchange: Exchange) {
> val message: Message = exchange.getIn()
> 
> val hasMore: NodeList = message.getHeader("hasMore", classOf[NodeList])
> message.setHeader("hasMore", hasMore.item(0).getTextContent())
> 
> val recordsReturned: NodeList = message.getHeader("recordsReturned", 
> classOf[NodeList])
> message.setHeader("recordsReturned", recordsReturned.item(0).getTextContent())
> 
> val totalRecordsAvailable: NodeList = 
> message.getHeader("totalRecordsAvailable", classOf[NodeList])
> message.setHeader("totalRecordsAvailable", 
> totalRecordsAvailable.item(0).getTextContent())
> }
> })
> .choice()
> .when().javaScript("parseInt(request.headers.get('totalRecordsAvailable')) > 
> parseInt(request.headers.get('StartIndex'))")
> .setHeader("StartIndex").javaScript("(parseInt(request.headers.get('SavingsStartIndex'))
>  + parseInt(request.headers.get('SavingsPageSize'))).toFixed()")
> .choice()
> .when().javaScript("parseInt(request.headers.get('totalRecordsAvailable')) - 
> parseInt(request.headers.get('StartIndex')) < 
> parseInt(request.headers.get('PageSize'))")
> .setHeader("PageSize").javaScript("(parseInt(request.headers.get('totalRecordsAvailable'))
>  - parseInt(request.headers.get('StartIndex'))).toFixed()")
> .endChoice()
> .wireTap("seda:CreateMessage")
> .endChoice()
> .split()
> .tokenizeXML("ns1:items")
> .parallelProcessing()
> .streaming()
> .to("jms:queue:Split")



Reply via email to