如何在Saxon中的XQuery中动态引用XML文件
发布时间:2020-12-15 23:55:15 所属栏目:百科 来源:网络整理
导读:我正在使用XQuery处理器Saxon. 现在我们在一个“.xqy”文件中编写我们的XQuery,我们将在其中引用我们将在其上执行XQuery的 XML文件. 请看下面的例子: for $x in doc("books.xml")/books/bookwhere $x/price30return $x/title 现在我想使用动态生成的XML而不
我正在使用XQuery处理器Saxon.
现在我们在一个“.xqy”文件中编写我们的XQuery,我们将在其中引用我们将在其上执行XQuery的 XML文件. 请看下面的例子: for $x in doc("books.xml")/books/book where $x/price>30 return $x/title 现在我想使用动态生成的XML而不是存储在某个路径中.比方说,我想在下面引用可用作字符串的XML. 怎么做? String book= <books> <book category="JAVA"> <title lang="en">Learn Java in 24 Hours</title> <author>Robert</author> <year>2005</year> <price>30.00</price> </book> <book category="DOTNET"> <title lang="en">Learn .Net in 24 hours</title> <author>Peter</author> <year>2011</year> <price>40.50</price> </book> <book category="XML"> <title lang="en">Learn XQuery in 24 hours</title> <author>Robert</author> <author>Peter</author> <year>2013</year> <price>50.00</price> </book> <book category="XML"> <title lang="en">Learn XPath in 24 hours</title> <author>Jay Ban</author> <year>2010</year> <price>16.50</price> </book> </books> Java代码: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import javax.xml.xquery.XQConnection; import javax.xml.xquery.XQDataSource; import javax.xml.xquery.XQException; import javax.xml.xquery.XQPreparedExpression; import javax.xml.xquery.XQResultSequence; import com.saxonica.xqj.SaxonXQDataSource; public class XQueryTester { public static void main(String[] args){ try { execute(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (XQException e) { e.printStackTrace(); } } private static void execute() throws FileNotFoundException,XQException{ InputStream inputStream = new FileInputStream(new File("books.xqy")); XQDataSource ds = new SaxonXQDataSource(); XQConnection conn = ds.getConnection(); XQPreparedExpression exp = conn.prepareExpression(inputStream); XQResultSequence result = exp.executeQuery(); while (result.next()) { System.out.println(result.getItemAsString(null)); } } }
如果你想找到一种使用Java绑定查询的输入(上下文项)的方法,我建议使用Saxon的S9API(用于XSLT的最直观的API,Java中的XPath和XQuery处理).
以下是如何实例化Saxon,编译查询,解析输入并使用绑定为其上下文项的输入文档来评估查询: // the Saxon processor object Processor saxon = new Processor(false); // compile the query XQueryCompiler compiler = saxon.newXQueryCompiler(); XQueryExecutable exec = compiler.compile(new File("yours.xqy")); // parse the string as a document node DocumentBuilder builder = saxon.newDocumentBuilder(); String input = "<xml>...</xml>"; Source src = new StreamSource(new StringReader(input)); XdmNode doc = builder.build(src); // instantiate the query,bind the input and evaluate XQueryEvaluator query = exec.load(); query.setContextItem(doc); XdmValue result = query.evaluate(); 请注意,如果Java代码生成XML文档,我强烈建议您使用S9API直接在内存中构建树,而不是将XML文档生成为字符串,然后解析它.如果可能的话. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |