Skip to main content

JDBC 4.0 SQLXML Interface

Posted by lancea on May 2, 2006 at 11:09 AM PDT

Since the public draft of the JDBC spec, the JDBC EG has reworked the SQLXML interface completely providing for more flexibility. The new version of the interface will be available in the Java SE 6 upcoming beta and should also be available in the current nightly builds.

The SQLXML interface provides methods for accessing the XML data in a datasource as a String, a Reader or Writer, or as a Stream. The XML value may also be accessed through a Source or set as a Result, which are used with XML Parser APIs such as DOM, SAX, and StAX, as well as with XSLT transforms and XPath evaluations.

The revised interface includes the following methods:

  • free - closes the object and releases the resources that it held
  • getBinaryStream - Retrieves the XML value designated by this SQLXML instance as a stream
  • getCharacterStream - Retrieves the XML value designated by this SQLXML instance as a java.io.Reader object
  • getSource - Returns a Source for reading the XML value designated by this SQLXML instance
  • getString - Returns a string representation of the XML value designated by this SQLXML instance
  • setBinaryStream - Retrieves a stream that can be used to write the XML value that this SQLXML instance represents
  • setCharacterStream - Retrieves a stream to be used to write the XML value that this SQLXML instance represents
  • setResult - Returns a Result for setting the XML value designated by this SQLXML instance
  • setString - Sets the XML value designated by this SQLXML instance to the given String representation

I have included some of the sample code we provided in the SQLXML javadoc:

The XML value of the SQLXML instance may be obtained as a BinaryStream using

   SQLXML sqlxml = resultSet.getSQLXML(column);
   InputStream binaryStream = sqlxml.getBinaryStream();

For example, to parse an XML value with a DOM parser:

   DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
   Document result = parser.parse(binaryStream);

or to parse an XML value with a SAX parser to your handler:

   SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
   parser.parse(binaryStream, myHandler);

or to parse an XML value with a StAX parser:

   XMLInputFactory factory = XMLInputFactory.newInstance();
   XMLStreamReader streamReader = factory.createXMLStreamReader(binaryStream);

Because databases may use an optimized representation for the XML, accessing the value through getSource() and setResult() can lead to improved processing performance without serializing to a stream representation and parsing the XML.

For example, to obtain a DOM Document Node:

   DOMSource domSource = sqlxml.getSource(DOMSource.class);
   Document document = (Document) domSource.getNode();

To set the value to a DOM Document Node to myNode:

   DOMResult domResult = sqlxml.setResult(DOMResult.class);
   domResult.setNode(myNode);
 

To send SAX events to your handler:

   SAXSource saxSource = sqlxml.getSource(SAXSource.class);
   XMLReader xmlReader = saxSource.getXMLReader();
   xmlReader.setContentHandler(myHandler);
   xmlReader.parse(saxSource.getInputSource());

To set the result value from SAX events:

   SAXResult saxResult = sqlxml.setResult(SAXResult.class);
   ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler();
   contentHandler.startDocument();
   // set the XML elements and attributes into the result
   contentHandler.endDocument();
 

To obtain StAX events:

   StAXSource staxSource = sqlxml.getSource(StAXSource.class);
   XMLStreamReader streamReader = staxSource.getXMLStreamReader();
 

To set the result value from StAX events:

   StAXResult staxResult = sqlxml.getResult(StAXResult.class);
   XMLStreamWriter streamWriter = staxResult.getXMLStreamWriter();
 

To perform XSLT transformations on the XML value using the XSLT in xsltFile output to file resultFile:

   File xsltFile = new File("a.xslt");
   File myFile = new File("result.xml");
   Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
   Source source = sqlxml.getSource(null);
   Result result = new StreamResult(myFile);
   xslt.transform(source, result);
 

To evaluate an XPath expression on the XML value:

   XPath xpath = XPathFactory.newInstance().newXPath();
   DOMSource domSource = sqlxml.getSource(DOMSource.class);
   Document document = (Document) domSource.getNode();
   String expression = "/foo/@bar";
   String barValue = xpath.evaluate(expression, document);
 

To set the XML value to be the result of an XSLT transform:

   File sourceFile = new File("source.xml");
   Transformer xslt = TransformerFactory.newInstance().newTransformer(new StreamSource(xsltFile));
   Source streamSource = new StreamSource(sourceFile);
   Result result = sqlxml.setResult(null);
   xslt.transform(streamSource, result);

Any Source can be transformed to a Result using the identity transform specified by calling newTransformer():

   Transformer identity = TransformerFactory.newInstance().newTransformer();
   Source source = sqlxml.getSource(null);
   File myFile = new File("result.xml");
   Result result = new StreamResult(myFile);
   identity.transform(source, result);
 

To write the contents of a Source to standard output:

   Transformer identity = TransformerFactory.newInstance().newTransformer();
   Source source = sqlxml.getSource(null);
   Result result = new StreamResult(System.out);
   identity.transform(source, result);
 

To create a DOMSource from a DOMResult:

    DOMSource domSource = new DOMSource(domResult.getNode()); 
 
Related Topics >>