Saturday, April 28, 2012

Evaluate XQuery Expressions with Java and SAXON 8


The following tip shows you how to combine Java and SAXON 8 in order to evaluate XQuery expressions. This application presumes that the XQuery expression is in an external file, called Q.xquery, and the XML file used for interrogation is called XML.xml: 

//Java
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.util.Properties;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;

//SAXON
import net.sf.saxon.om.DocumentInfo;
import net.sf.saxon.Configuration;
import net.sf.saxon.om.NodeInfo;
import net.sf.saxon.query.DynamicQueryContext;
import net.sf.saxon.query.StaticQueryContext;
import net.sf.saxon.query.XQueryExpression;
import net.sf.saxon.trans.XPathException;

public class XQueryExample {

    public static void main(String[] args) {
        
       //the Q.xquery file
       InputStream queryStream=null;
       String queryFileName="C://Data_Local//XML//XQuery//Q.xquery";
         
       //documentul XML ce va fi interogat este reprezentat de
       //fisierul AircraftDealer.xml  
       File XMLStream=null;
       String xmlFileName="C://Data_Local//XML//XQuery//XML.xml";

       //print the result to the console
       OutputStream destStream=System.out;
                          
       //compile the XQuery expression
       XQueryExpression exp=null;
       
       //create a Configuration object
       Configuration C=new Configuration();
        
       //static and dynamic context
       StaticQueryContext SQC=new StaticQueryContext(C);
       DynamicQueryContext DQC=new DynamicQueryContext(C);      
        
       //indentation
       Properties props=new Properties();
       props.setProperty(OutputKeys.METHOD,"xml");
       props.setProperty(OutputKeys.INDENT,"yes");

        try{
           queryStream=new FileInputStream(queryFileName);
           SQC.setBaseURI(new File(queryFileName).toURI().toString());
           
           //compilation
           exp=SQC.compileQuery(queryStream,null);
           SQC=exp.getStaticContext(); 
           }catch(net.sf.saxon.trans.XPathException e)
             {System.err.println(e.getMessage());
           }catch(java.io.IOException e)
             {System.err.println(e.getMessage());}
          
          //get the XML ready
          try{   
             XMLStream=new File(xmlFileName);
             InputSource XMLSource=new InputSource(XMLStream.toURI().toString());
             SAXSource SAXs=new SAXSource(XMLSource); 
             DocumentInfo DI=SQC.buildDocument(SAXs);
             DQC.setContextNode(DI);

             //evaluating
             exp.run(DQC,new StreamResult(destStream),props);
             destStream.close();
             }catch(net.sf.saxon.trans.XPathException e)
                  {System.err.println(e.getMessage());
             }catch (java.io.IOException e)
                  {System.err.println(e.getMessage());}
                          
    }   
}

No comments:

Post a Comment