|
next
|
Subject: Saxon 8 with multiple xml input Author: Charles Tsang Date: 23 Jun 2007 11:11 AM
|
Hi, I have a java application that loads the xquery file
from the database (as byte[]), it also generates an xml file
(as String) as the input of xquery. I have the following
methods
BTW, I'm using Stylus Studio 2007 Release 2.
protected Properties getProperties() {
Properties props = new Properties();
props.setProperty(OutputKeys.METHOD, "xml");
props.setProperty(OutputKeys.INDENT, "yes");
return props;
}
protected void runXQuery(byte[] xquerySource, String xmlString) {
Configuration config = new Configuration();
StaticQueryContext sQueryContext = new StaticQueryContext(config);
DynamicQueryContext dQueryContext = new DynamicQueryContext(config);
ByteArrayInputStream bais = new ByteArrayInputStream(xquerySource);
InputStreamReader streamReader = new InputStreamReader(bais);
XQueryExpression queryExp = sQueryContext.compileQuery(streamReader);
ByteArrayInputStream bais = new ByteArrayInputStream(xmlString.getBytes());
StreamSource source = new StreamSource(bais);
dQueryContext.setContextItem(sQueryContext.buildDocument(source));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
queryExp.run(dQueryContext, new StreamResult(baos), getProperties());
}
protected void runXQueryBind(byte[] xquerySource, String paramName, String xmlString) {
Configuration config = new Configuration();
StaticQueryContext sQueryContext = new StaticQueryContext(config);
DynamicQueryContext dQueryContext = new DynamicQueryContext(config);
ByteArrayInputStream bais = new ByteArrayInputStream(xquerySource);
InputStreamReader streamReader = new InputStreamReader(bais);
XQueryExpression queryExp = sQueryContext.compileQuery(streamReader);
try {
XQueryExpression xqe = sQueryContext.compileQuery(xmlString);
SequenceIterator si = xqe.iterator(dQueryContext).getAnother();
Item item = si.next();
if (item != null && si.next() == null && item instanceof AtomicValue) {
xvalue = (AtomicValue)item;
} else {
xvalue = new SequenceExtent(xqe.iterator(dQueryContext));
}
} catch(Exception ioe) {
ioe.printStackTrace();
//throw new JCException(ioe.getMessage());
xvalue = new UntypedAtomicValue(new String(data));
}
dQueryContext.setParameter(paramName, xvalue);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
queryExp.run(dQueryContext, new StreamResult(baos), getProperties());
}
Can someone help me with the following questions:
1) In method runXQueryBind, is that the right way to bind a paramName
and xmlString into XQuery? If not, can you show me a sample.
2) When I run my code using the 'runXQuery()' method, it took only 3
seconds. But when I run it with 'runXQueryBind()', it took 986
seconds!! Do you know why?
Your help is greatly appreciated
method
|
next
|
Subject: Saxon 8 with multiple xml input Author: (Deleted User) Date: 27 Jun 2007 11:48 AM
|
Hi Charles,
the bindParameter method generated by Stylus Studio has been designed to assign to a parameter the result of another XQuery (so that you can assign a specific type, xs:nonNegativeInt(9), or the result of an XPath navigation, or the result of a arithmetic computation).
In your case you are specifying an entire XML fragment; apart that parsing could fail (some XML nodes are not supported as literal values inside XQuery documents), you get bad performances as you are using the XQuery parser to build a query that in the end creates a DOM tree. You should directly parse the XML and assign it to the parameter, like in this code:
private static void bindXMLParameter(StaticQueryContext staticContext, DynamicQueryContext dynamicContext, String paramName, String paramValue)
{
try{
Value xvalue=new SingletonNode(staticContext.getConfiguration().buildDocument(new StreamSource(new StringReader(paramValue))));
dynamicContext.setParameter(paramName, xvalue);
}
catch(java.lang.Exception e)
{
System.err.print(e.getMessage());
}
}
Hope this helps,
Alberto
|
|
|
|