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