package org.basex.examples.xqj.cfoster; import java.io.*; import java.util.*; import javax.xml.datatype.*; import javax.xml.namespace.*; import javax.xml.parsers.*; import javax.xml.xquery.*; import org.w3c.dom.*; /** * XQJ Example, derived from the XQJ Tutorial * <a href="http://www.cfoster.net/articles/xqj-tutorial"> * http://www.cfoster.net/articles/xqj-tutorial</a> from Charles Foster. * * Part 4: XDM Model within XQJ. * * @author BaseX Team 2005-17, BSD License */ public final class Part4 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("4: XDM Model within XQJ"); // Create the connection XQConnection conn = connect(); // Create XQuery items from int values info("Create XQuery items from int values"); XQItem[] items = new XQItem[7]; // Create an XQItem type, with a type of xs:int and a value of 0 items[0] = conn.createItemFromInt(0, null); XQItemType xsInteger = conn.createAtomicType(XQItemType.XQBASETYPE_INTEGER); XQItemType xsString = conn.createAtomicType(XQItemType.XQBASETYPE_STRING); XQItemType xsByte = conn.createAtomicType(XQItemType.XQBASETYPE_BYTE); XQItemType xsDecimal = conn.createAtomicType(XQItemType.XQBASETYPE_DECIMAL); XQItemType xsLong = conn.createAtomicType(XQItemType.XQBASETYPE_LONG); // Create an XQItem, with a type of xs:integer and a value of 1 items[1] = conn.createItemFromInt(1, xsInteger); // Create an XQItem, with a type of xs:string and a value of 2 items[2] = conn.createItemFromInt(2, xsString); // Create an XQItem, with a type of xs:byte and a value of 3 items[3] = conn.createItemFromInt(3, xsByte); // Create an XQItem, with a type of xs:decimal and a value of 4 items[4] = conn.createItemFromInt(4, xsDecimal); // Create an XQItem, with a type of xs:long and a value of 5 items[5] = conn.createItemFromInt(5, xsLong); // Try to create an XQItem, with a type of xs:byte and a value of 1000 // This causes an XQException, because the // value 1000 is outside the range of xs:byte (-128 to 127) try { items[6] = conn.createItemFromInt(1000, xsByte); } catch(final XQException ex) { System.out.println(ex.getMessage()); } for(XQItem it : items) { if(it != null) it.writeItem(System.out, null); System.out.print(' '); } System.out.println(); // Create items from atomic values info("Create items from atomic values"); XQItemType date = // xs:date conn.createAtomicType(XQItemType.XQBASETYPE_DATE); XQItemType hex = // xs:hexBinary conn.createAtomicType(XQItemType.XQBASETYPE_HEXBINARY); XQItem dateValue = conn.createItemFromAtomicValue("2007-01-23", date); XQItem binaryData = conn.createItemFromAtomicValue("48656C6C6F", hex); dateValue.writeItem(System.out, null); System.out.println(); binaryData.writeItem(System.out, null); System.out.println(); // Create items from Java objects info("Create items from atomic values"); items = new XQItem[3]; // Create an XQItem with a type of xs:int items[0] = conn.createItemFromObject(5, null); // Create an XQItem with a type of xs:float items[1] = conn.createItemFromObject(123.4f, null); // Create an XQItem with a type of xs:hexBinary items[2] = conn.createItemFromObject(new byte[] { 1, 2, 3, 4 }, null); for(XQItem it : items) { if(it != null) System.out.println(it.getAtomicValue()); } // Create and bind XQuery sequences info("Create and bind XQuery sequences"); List<Object> list = new ArrayList<>(); list.add(conn.createItemFromInt(1, null)); list.add(conn.createItemFromInt(2, null)); list.add(conn.createItemFromInt(3, null)); list.add(4); list.add(5); list.add(6); XQSequence sequence = conn.createSequence(list.iterator()); XQPreparedExpression xqpe = conn.prepareExpression("declare variable $x as xs:int+ external; $x"); xqpe.bindSequence(new QName("x"), sequence); XQResultSequence rs = xqpe.executeQuery(); while(rs.next()) System.out.println(rs.getItemAsString(null) + ", " + rs.getItemType()); // Bind XQResultSequences to XQuery Expressions info("Bind XQResultSequences to XQuery Expressions"); XQExpression expr = conn.createExpression(); String path = new File("src/main/resources/xml").getAbsolutePath(); String xqueryString = "for $x in doc('" + path + "/books.xml')//book/@isbn " + "return xs:string($x)"; rs = expr.executeQuery(xqueryString); // Create a copy of the XQResultSequence that is scrollable and in memory. sequence = conn.createSequence(rs); expr.bindSequence(new QName("isbnCodes"), sequence); xqueryString = "declare variable $isbnCodes external; $isbnCodes"; rs = expr.executeQuery(xqueryString); while(rs.next()) { System.out.println(rs.getItemAsString(null)); } // Retrieve XML nodes info("Retrieve XML nodes"); expr = conn.createExpression(); xqueryString = "doc('" + path + "/books.xml')//book"; rs = expr.executeQuery(xqueryString); while(rs.next()) { Node book = rs.getNode(); // org.w3c.dom.Element System.out.println(book); } // Create XML nodes info("Create XML nodes"); // Create {@link Document} instance DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document docObj = builder.newDocument(); Element elementObj = docObj.createElement("e"); // from org.w3c.dom // Create an XQItem with a type of element() XQItem item1 = conn.createItemFromObject(elementObj, null); // Create an XQItem with a type of document-node() XQItem items2 = conn.createItemFromObject(docObj, null); System.out.println(item1.getItemType()); System.out.println(items2.getItemType()); // Retrieve date values info("Retrieve date values"); xqueryString = "for $x in doc('" + path + "/books.xml')//publish_date " + "return xs:date($x)"; rs = expr.executeQuery(xqueryString); while(rs.next()) { XMLGregorianCalendar cal = (XMLGregorianCalendar) rs.getObject(); int day = cal.getDay(); int month = cal.getMonth(); int year = cal.getYear(); System.out.println(year + "/" + month + '/' + day); } // Closing connection to the Database. close(conn); } }