package org.basex.examples.xqj.tutorial; import java.io.*; import javax.xml.namespace.*; import javax.xml.parsers.*; import javax.xml.stream.*; import javax.xml.xquery.*; import org.w3c.dom.*; /** * XQJ Examples, derived from an * <a href="https://www.progress.com/products/data-integration-suite/data-integration-suite-developer-center/data-integration-suite-tutorials/learning-xquery/introduction-to-the-xquery-api-for-java-xqj-"> * XQJ online tutorial</a>. * * Part 8: Binding External Variables. * * @author BaseX Team 2005-17, BSD License */ public final class Part8 extends Main { /** * Main method of the example class. * @param args (ignored) command-line arguments * @throws Exception exception */ public static void main(final String... args) throws Exception { init("8: Binding External Variables"); // Create a connection String path = new File("src/main/resources/xml").getAbsolutePath(); XQConnection xqc = connect(); XQPreparedExpression xqp; // Bind an item to an external variable xqp = xqc.prepareExpression( "declare variable $id as xs:integer external; " + "doc('" + path + "/orders.xml')//order[id=$id]"); xqp.bindObject(new QName("id"), 174, null); print("Bind item to external variable", xqp); // Bind integers to external variables XQItemType xsinteger; xsinteger = xqc.createAtomicType(XQItemType.XQBASETYPE_INTEGER); xqp = xqc.prepareExpression( "declare variable $v1 external; " + "declare variable $v2 external; " + "$v1 instance of xs:integer, " + "$v1 instance of xs:int, " + "$v2 instance of xs:integer, " + "$v2 instance of xs:int"); xqp.bindObject(new QName("v1"), 174, null); xqp.bindObject(new QName("v2"), 174, xsinteger); print("Bind integers to external variables", xqp); // Bind atomic values xqp = xqc.prepareExpression( "declare variable $v1 external; " + "declare variable $v2 external; " + "declare variable $v3 external; " + "($v1, $v2, $v3)"); xqp.bindAtomicValue(new QName("v1"), "123", xqc.createAtomicType(XQItemType.XQBASETYPE_STRING)); xqp.bindAtomicValue(new QName("v2"), "123", xqc.createAtomicType(XQItemType.XQBASETYPE_INTEGER)); xqp.bindAtomicValue(new QName("v3"), "123", xqc.createAtomicType(XQItemType.XQBASETYPE_DOUBLE)); // Invalid integer cast info("Invalid integer cast"); xqp = xqc.prepareExpression("declare variable $e external; $e"); try { xqp.bindAtomicValue(new QName("e"), "abc", xqc.createAtomicType(XQItemType.XQBASETYPE_INTEGER)); } catch(final XQException ex) { System.out.println(ex.getMessage()); } // Invalid item type info("Invalid item type:"); xqp = xqc.prepareExpression("declare variable $e external; $e"); try { xqp.bindAtomicValue(new QName("e"), "123", null); } catch(final XQException ex) { System.out.println(ex.getMessage()); } // Bind specific types xqp = xqc.prepareExpression("declare variable $v external; $v"); xqp.bindInt(new QName("v"), 123, xqc.createAtomicType(XQItemType.XQBASETYPE_INTEGER)); print("Bind specific types", xqp); // Bind via DOM DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = dbf.newDocumentBuilder(); Document domDocument = parser.parse(path + "/orders.xml"); xqp = xqc.prepareExpression("declare variable $e external; $e"); xqp.bindNode(new QName("e"), domDocument, null); print("Bind via DOM", xqp); // Bind via StAX XMLInputFactory xif = XMLInputFactory.newInstance(); try(FileInputStream fis = new FileInputStream(path + "/orders.xml")) { XMLStreamReader reader = xif.createXMLStreamReader(fis); xqp = xqc.prepareExpression("declare variable $e external; $e"); xqp.bindDocument(new QName("e"), reader, null); } print("Bind via StAX", xqp); // Bind via input stream xqp = xqc.prepareExpression("declare variable $e external; $e"); try(FileInputStream fis = new FileInputStream(path + "/orders.xml")) { xqp.bindDocument(new QName("e"), fis, null, null); } print("Bind via input stream", xqp); // Close the connection close(xqc); } }