you're right, it works:)

Thank you very much Claus.

titexe

Claus Ibsen-2 wrote:
> 
> On Thu, Dec 17, 2009 at 9:34 AM, titexe <[email protected]> wrote:
>>
>> thank you for your answers,
>>
>> I am in testing phase, the solutions you have proposed
>>
>> Claus excuse me, I have to put your code (in which file camel.xml or
>> activemq.xml) and in each part?
>>
> 
> No just proves the point that Stephen was wrong that you you CAN set
> the resultType when using xpath with XML.
> 
> Such as:
>     <xpath resultType="java.lang.String">foo/bar/text()</xpath>
> 
> 
> 
>> thank you
>>
>>
>>
>> Claus Ibsen-2 wrote:
>>>
>>> On Thu, Dec 17, 2009 at 3:25 AM, Stephen Gargan <[email protected]>
>>> wrote:
>>>> I'm guessing that you expected to receive the 'ALLAH' string at your
>>>> endpoint and were receiving a DeferredCDATASectionImpl object instead
>>>> is
>>>> this correct? The unit test below illustrates what is happening (it
>>>> uses
>>>> the
>>>> java DSL with the first of the 3 routes being pretty much the same as
>>>>  what
>>>> your spring xml route is defining).
>>>>
>>>> The test 'testFailsDueToTypeConversion' shows that what you actually
>>>> receive
>>>> from the xpath split is a instance of DeferredCDATASectionImpl. I'm
>>>> guessing
>>>> you expected this to be a String and were trying to use value() to make
>>>> it
>>>> so. There are a couple of ways to do this as the rest of the test
>>>> shows.
>>>>
>>>> First and easiest is to use a result type in your xpath expression,
>>>> e.g.
>>>> xpath("/request/header/source/text()", String.class), this will
>>>> correctly
>>>> extract the data from the DeferredCDATASectionImpl object.
>>>> Unfortunately,
>>>> you cannot currently specify a result type in an XML route, though It
>>>> would
>>>> be an easy thing to add so maybe you should open a Jira ticket.
>>>>
>>>
>>> Yes you can specify that in Spring XML. There is an attribute for that.
>>>
>>>  <xs:complexType name="xPathExpression">
>>>     <xs:simpleContent>
>>>       <xs:extension base="tns:namespaceAwareExpression">
>>>         <xs:attribute name="resultType" type="xs:string"/>
>>>       </xs:extension>
>>>     </xs:simpleContent>
>>>   </xs:complexType>
>>>
>>>> Secondly you could use an intermediate bean to grab the data from the
>>>> DeferredCDATASectionImpl and pass it on e.g. 'testWithBeanConversion.'
>>>>
>>>> Third and probably the best would be to add an explicit type converter
>>>> for
>>>> it. The test 'testWithRegisteredConverter' shows how using the
>>>> CDataTypeConverter bean below. There is excellent documentation on Type
>>>> converters at the Camel website
>>>> http://camel.apache.org/type-converter.html
>>>>
>>>> Hope this helps,
>>>>
>>>> ste
>>>>
>>>> public class CDataXPathTest extends ContextTestSupport
>>>> {
>>>>   �...@override
>>>>    protected RouteBuilder createRouteBuilder() throws Exception
>>>>    {
>>>>        return new RouteBuilder()
>>>>        {
>>>>           �...@override
>>>>            public void configure() throws Exception
>>>>            {
>>>>
>>>>
>>>> from("direct:xpath-no-conversion").split().xpath("/request/header/source/text()").to("mock:test");
>>>>
>>>> from("direct:xpath-with-result-type").split().xpath("/request/header/source/text()",
>>>> String.class).to("mock:test");
>>>>
>>>> from("direct:xpath-with-bean-converter").split().xpath("/request/header/source/text()").bean(new
>>>> MySourceProcessor()).to("mock:test");
>>>>            }
>>>>        };
>>>>    }
>>>>
>>>>    public void testFailsDueToTypeConversion() throws Exception
>>>>    {
>>>>        MockEndpoint mock = getMockEndpoint("mock:test");
>>>>        mock.expectedMessageCount(1);
>>>>
>>>>        String xml =
>>>> "<request><header><source><![CDATA[ALLAH]]></source></header></request>";
>>>>        sendBody("direct:xpath-no-conversion", xml);
>>>>
>>>>        mock.await();
>>>>        mock.assertIsSatisfied();
>>>>
>>>>        Object receieved =
>>>> ExchangeHelper.getMandatoryInBody(mock.getReceivedExchanges().get(0));
>>>>        assertIsInstanceOf(DeferredCDATASectionImpl.class, receieved);
>>>>    }
>>>>
>>>>
>>>>    public void testWithResultTypeConversion() throws Exception
>>>>    {
>>>>        MockEndpoint mock = getMockEndpoint("mock:test");
>>>>        mock.expectedBodiesReceived("ALLAH");
>>>>
>>>>        String xml =
>>>> "<request><header><source><![CDATA[ALLAH]]></source></header></request>";
>>>>        sendBody("direct:xpath-with-result-type", xml);
>>>>
>>>>        mock.await();
>>>>        mock.assertIsSatisfied();
>>>>    }
>>>>
>>>>    public void testWithBeanConversion() throws Exception
>>>>    {
>>>>        MockEndpoint mock = getMockEndpoint("mock:test");
>>>>        mock.expectedBodiesReceived("ALLAH");
>>>>
>>>>        String xml =
>>>> "<request><header><source><![CDATA[ALLAH]]></source></header></request>";
>>>>        sendBody("direct:xpath-with-bean-converter", xml);
>>>>
>>>>        mock.await();
>>>>        mock.assertIsSatisfied();
>>>>    }
>>>>
>>>>    public void testWithRegisteredConverter() throws Exception
>>>>    {
>>>>      
>>>>  context.getTypeConverterRegistry().addTypeConverter(String.class,
>>>> DeferredCDATASectionImpl.class, new CDataTypeConverter());
>>>>        MockEndpoint mock = getMockEndpoint("mock:test");
>>>>        mock.expectedBodiesReceived("ALLAH");
>>>>
>>>>        String xml =
>>>> "<request><header><source><![CDATA[ALLAH]]></source></header></request>";
>>>>        sendBody("direct:xpath-no-conversion", xml);
>>>>
>>>>        mock.await();
>>>>        mock.assertIsSatisfied();
>>>>    }
>>>>
>>>>    public static class MySourceProcessor
>>>>    {
>>>>        public String handleCdata(DeferredCDATASectionImpl payload)
>>>>        {
>>>>            return payload.getData();
>>>>        }
>>>>    }
>>>>
>>>>    public static class CDataTypeConverter implements TypeConverter
>>>>    {
>>>>        public <T> T convertTo(Class<T> type, Object value) {
>>>>            DeferredCDATASectionImpl cdata =
>>>> (DeferredCDATASectionImpl)value;
>>>>            return (T) cdata.getData();
>>>>        }
>>>>
>>>>        public <T> T convertTo(Class<T> type, Exchange exchange, Object
>>>> value) {
>>>>            return convertTo(type, value);
>>>>        }
>>>>
>>>>        public <T> T mandatoryConvertTo(Class<T> type, Object value) {
>>>>            return convertTo(type, value);
>>>>        }
>>>>
>>>>        public <T> T mandatoryConvertTo(Class<T> type, Exchange
>>>> exchange,
>>>> Object value) {
>>>>            return convertTo(type, value);
>>>>        }
>>>>    }
>>>> }
>>>>
>>>> On Wed, Dec 16, 2009 at 9:27 AM, titexe <[email protected]> wrote:
>>>>
>>>>>
>>>>> hello,
>>>>>
>>>>> my xpath query does not work, when I put the text value () to finish:
>>>>>
>>>>> /request/header/source/text()
>>>>>
>>>>> body of my message :
>>>>>
>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>> <request>
>>>>>        <header>
>>>>>                <source><![CDATA[ALLAH]]></source>
>>>>>        </header>
>>>>> </request>
>>>>>
>>>>>
>>>>> my route :
>>>>>
>>>>> <route>
>>>>> <from uri="activemq:queue:IN1"/>
>>>>> <split>
>>>>> <xpath>/request/header/source/text()</ xpath>
>>>>>
>>>>> <t uri="activemq:queue:XML"/>
>>>>> </ Split>
>>>>> <t uri="activemq:queue:RESULT"/>
>>>>> </ route>
>>>>>
>>>>> any idea?
>>>>>
>>>>> thanks in advance,
>>>>>
>>>>> titexe
>>>>> --
>>>>> View this message in context:
>>>>> http://old.nabble.com/camel-%3A-xpath---text%28%29-tp26815065p26815065.html
>>>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>>>
>>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Claus Ibsen
>>> Apache Camel Committer
>>>
>>> Author of Camel in Action: http://www.manning.com/ibsen/
>>> Open Source Integration: http://fusesource.com
>>> Blog: http://davsclaus.blogspot.com/
>>> Twitter: http://twitter.com/davsclaus
>>>
>>>
>>
>> --
>> View this message in context:
>> http://old.nabble.com/camel-%3A-xpath---text%28%29-tp26815065p26824799.html
>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>
>>
> 
> 
> 
> -- 
> Claus Ibsen
> Apache Camel Committer
> 
> Author of Camel in Action: http://www.manning.com/ibsen/
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
> 
> 

-- 
View this message in context: 
http://old.nabble.com/camel-%3A-xpath---text%28%29-tp26815065p26825824.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to