使用Saxon能否将XQuery编译为包?或如何缩短编译耗时?
实现Saxon EE XQuery编译结果的序列化与复用
好消息!你完全可以做到这一点——Saxon EE的XQuery API确实支持将编译后的查询序列化到磁盘,和XSLT的XsltPackage机制非常类似,能帮你省去重复编译大Schema和查询的时间。
核心原理
Saxon EE会将编译后的XQuery(包括Schema感知的相关信息)序列化为**SEF(Saxon Executable Format)**格式的文件,这个文件包含了所有执行查询所需的预编译信息,后续加载时可以直接复用,无需重新编译Schema和XQuery。
具体实现步骤
1. 编译XQuery并序列化到磁盘
下面是C#代码示例,演示如何编译Schema感知的XQuery并保存到文件:
using Saxon.Api; // 初始化支持Schema感知的Processor var processor = new Processor(true); // 加载并编译你的大型Schema var schemaManager = processor.SchemaManager; // 可根据实际情况添加多个Schema文件 schemaManager.Compile(new Uri("path/to/your/large-schema.xsd")); // 创建XQuery编译器并启用Schema感知 var queryCompiler = processor.NewXQueryCompiler(); queryCompiler.SchemaAware = true; // 编译XQuery文件 XQueryExecutable compiledQuery = queryCompiler.Compile(new Uri("path/to/your/query.xq")); // 将编译结果序列化到磁盘 compiledQuery.Save("compiled-query.sef");
2. 加载序列化后的查询并复用
当需要复用编译结果时,只需从磁盘加载SEF文件即可,无需重新编译Schema和XQuery:
using Saxon.Api; // 初始化同版本的支持Schema感知的Processor var processor = new Processor(true); // 直接加载序列化后的查询文件 XQueryExecutable compiledQuery = processor.LoadQueryExecutable(new Uri("compiled-query.sef")); // 创建查询运行时上下文并执行 var queryRuntime = compiledQuery.Load(); // 可按需设置上下文项、外部变量等 // queryRuntime.ContextItem = ...; // 执行查询并获取结果 XdmValue queryResult = queryRuntime.Evaluate();
关键注意事项
- 必须使用Saxon EE版本:这个序列化功能是Saxon EE的专属特性,HE版本不支持。
- 版本一致性:确保加载时使用的Saxon版本和编译时完全一致,不同版本的SEF格式可能不兼容。
- 静态依赖整合:编译时XQuery依赖的Schema、模块等静态资源会被整合到SEF文件中,加载时无需再重复提供这些资源。
内容的提问来源于stack exchange,提问作者MrD at KookerellaLtd
相关产品推荐
相关产品推荐

