加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在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文档生成为字符串,然后解析它.如果可能的话.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读