You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by "Walzer, Thomas" <th...@integratix.net> on 2013/11/13 19:37:30 UTC

XQuery (camel-saxon)

Hi,

I would like to run an xquery like:

  for $i in //Member return ("Name = ", $i/Name/text(), " FavoriteColor = ", $i/FavoriteColor/text())  

onto a file like:

<?xml version="1.0"?>
<FitnessCenter>
  <Member level="platinum">
    <Name>Jeff</Name>
    <FavoriteColor>lightgrey</FavoriteColor>
  </Member>
  <Member level="gold">
    <Name>David</Name>
    <FavoriteColor>lightblue</FavoriteColor>
  </Member>
  <Member level="platinum">
    <Name>Roger</Name>
    <FavoriteColor>lightyellow</FavoriteColor>
  </Member>
</FitnessCenter>

—> this does not work (see stacktrace)

However when I change my xquery like so:

<NAMES>{for $i in //Member return $i/Name/text()}</NAMES>

—> it works fine. However I do not want to output xml...

This affects at least Camel versions 2.10.6 and 2.13.

It seems like the result from the xquery has to be well-formed xml. This is ok for some use cases. However sometimes xquery comes in handy to output non-xml format.
I am probably missing some sauce to add to my xquery…
I tested this with the camel-example-spring-xquery.

Cheers, Thomas.


Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.apache.camel.RuntimeExpressionException: net.sf.saxon.trans.XPathException: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
	at org.apache.camel.component.xquery.XQueryBuilder.evaluate(XQueryBuilder.java:145)
	at org.apache.camel.component.xquery.XQueryBuilder.process(XQueryBuilder.java:102)
	at org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:103)
	at org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:71)
	at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
	at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:110)
	at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
	at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)
	at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
	at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
	at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
	at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
	at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:401)
	at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:201)
	at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:165)
	at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:187)
	at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:114)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
	at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:695)
Caused by: net.sf.saxon.trans.XPathException: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
	at net.sf.saxon.dom.DOMWriter.characters(DOMWriter.java:218)
	at net.sf.saxon.event.ProxyReceiver.characters(ProxyReceiver.java:193)
	at net.sf.saxon.event.TreeReceiver.characters(TreeReceiver.java:246)
	at net.sf.saxon.event.TreeReceiver.append(TreeReceiver.java:295)
	at net.sf.saxon.evpull.EventIteratorToReceiver.copy(EventIteratorToReceiver.java:60)
	at net.sf.saxon.query.XQueryExpression.pull(XQueryExpression.java:508)
	at org.apache.camel.component.xquery.XQueryBuilder.evaluateAsDOM(XQueryBuilder.java:179)
	at org.apache.camel.component.xquery.XQueryBuilder.evaluate(XQueryBuilder.java:135)
	... 25 more
Caused by: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
	at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.java:356)
	at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.java:284)
	at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.insertBefore(CoreDocumentImpl.java:400)
	at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:235)
	at net.sf.saxon.dom.DOMWriter.characters(DOMWriter.java:215)


Re: XQuery (camel-saxon)

Posted by "Willem.Jiang" <wi...@gmail.com>.
XQuery suppose to set the result type like this

 from("direct:start").xquery("concat('mock:foo.', /person/@city)",
String.class);

The default result type is DOM.class.






--
View this message in context: http://camel.465427.n5.nabble.com/XQuery-camel-saxon-tp5743206p5743251.html
Sent from the Camel - Users mailing list archive at Nabble.com.