XQuery Saxon 异常 (java.lang.IllegalArgumentException)
XQuery Saxon Exception (java.lang.IllegalArgumentException)
我不是 XQuery 专家。只要知道就够了。最近我将我的 Xquery 执行代码从 Saxon 8.4 迁移到了 9.9.1.2。所以我对 XQ 文件的执行方式做了一些更改。代码没有错误,但在 运行 时间内,出现异常:
java.lang.IllegalArgumentException: Supplied node must be built using
the same or a compatible Configuration
我修改为 运行 XQ 文件的代码如下所示:
// Prepare the environment for Saxon
SaxonErrorListener listener = new SaxonErrorListener();
listener.setLogger(new StandardLogger(new PrintStream(errors, true, "UTF-8")));
getSaxonConfig().setErrorListener(listener);
StaticQueryContext staticContext = new StaticQueryContext(getSaxonConfig());
Configuration configuration = new Configuration();
staticContext.setBaseURI("");
// Set up the dynamic context
DynamicQueryContext dynamicContext = new DynamicQueryContext(getSaxonConfig());
if ((xmlData != null) && (xmlData.length() > 0)) {
dynamicContext.setContextItem(configuration.buildDocumentTree(new StreamSource(new StringReader(xmlData))).getRootNode());
}
// If required use a (URI) uriResolver to handle xquery "doc" functions and module imports
if (uriResolver != null) {
dynamicContext.setURIResolver(uriResolver);
staticContext.setModuleURIResolver(uriResolver);
}
// If any external variables required, add them to the dynamic context
if (getExternalVariables().size() > 0) {
for (String varname : getExternalVariables().keySet()) {
StructuredQName structuredQName = new StructuredQName("", "", varname);
ObjectValue<Object> objectValue = new ObjectValue<Object>(getExternalVariables().get(varname));
dynamicContext.setParameter(structuredQName, objectValue);
}
}
// Prepare the XQuery
XQueryExpression exp;
exp = staticContext.compileQuery(xQuery);
// Run the XQuery
StringWriter out = new StringWriter();
exp.run(dynamicContext, new StreamResult(out), saxonProps);
// Collect the content
xqResult = out.toString();
抛出错误的行是:
dynamicContext.setContextItem(configuration.buildDocumentTree(new StreamSource(new StringReader(xmlData))).getRootNode());
现在我用 Google 搜索了解决方案,但没有找到太多相关信息。 XQ 文档也没有太多可供我学习的示例。任何帮助,将不胜感激。谢谢!
从 8.4 开始,您使用的 API 类 和方法(如 StaticQueryContext
和 DynamicQueryContext
)不再是最佳实践,如果它们在全部。 9.1左右引入了s9api接口,更好用,更稳定
但是,错误是因为您有多个 Saxon Configuration
对象。我无法确切地看到发生了什么,因为你没有向我们展示完整的图片,但是创建一个 new Configuration()
时必须已经存在一个用于 getSaxonConfig()
访问的调用看起来像个坏消息.
我看不出 getSaxonConfig()
做了什么,但我猜如果你改变
Configuration configuration = new Configuration();
至
Configuration configuration = getSaxonConfig();
那么问题就迎刃而解了。
我不是 XQuery 专家。只要知道就够了。最近我将我的 Xquery 执行代码从 Saxon 8.4 迁移到了 9.9.1.2。所以我对 XQ 文件的执行方式做了一些更改。代码没有错误,但在 运行 时间内,出现异常:
java.lang.IllegalArgumentException: Supplied node must be built using the same or a compatible Configuration
我修改为 运行 XQ 文件的代码如下所示:
// Prepare the environment for Saxon
SaxonErrorListener listener = new SaxonErrorListener();
listener.setLogger(new StandardLogger(new PrintStream(errors, true, "UTF-8")));
getSaxonConfig().setErrorListener(listener);
StaticQueryContext staticContext = new StaticQueryContext(getSaxonConfig());
Configuration configuration = new Configuration();
staticContext.setBaseURI("");
// Set up the dynamic context
DynamicQueryContext dynamicContext = new DynamicQueryContext(getSaxonConfig());
if ((xmlData != null) && (xmlData.length() > 0)) {
dynamicContext.setContextItem(configuration.buildDocumentTree(new StreamSource(new StringReader(xmlData))).getRootNode());
}
// If required use a (URI) uriResolver to handle xquery "doc" functions and module imports
if (uriResolver != null) {
dynamicContext.setURIResolver(uriResolver);
staticContext.setModuleURIResolver(uriResolver);
}
// If any external variables required, add them to the dynamic context
if (getExternalVariables().size() > 0) {
for (String varname : getExternalVariables().keySet()) {
StructuredQName structuredQName = new StructuredQName("", "", varname);
ObjectValue<Object> objectValue = new ObjectValue<Object>(getExternalVariables().get(varname));
dynamicContext.setParameter(structuredQName, objectValue);
}
}
// Prepare the XQuery
XQueryExpression exp;
exp = staticContext.compileQuery(xQuery);
// Run the XQuery
StringWriter out = new StringWriter();
exp.run(dynamicContext, new StreamResult(out), saxonProps);
// Collect the content
xqResult = out.toString();
抛出错误的行是:
dynamicContext.setContextItem(configuration.buildDocumentTree(new StreamSource(new StringReader(xmlData))).getRootNode());
现在我用 Google 搜索了解决方案,但没有找到太多相关信息。 XQ 文档也没有太多可供我学习的示例。任何帮助,将不胜感激。谢谢!
从 8.4 开始,您使用的 API 类 和方法(如 StaticQueryContext
和 DynamicQueryContext
)不再是最佳实践,如果它们在全部。 9.1左右引入了s9api接口,更好用,更稳定
但是,错误是因为您有多个 Saxon Configuration
对象。我无法确切地看到发生了什么,因为你没有向我们展示完整的图片,但是创建一个 new Configuration()
时必须已经存在一个用于 getSaxonConfig()
访问的调用看起来像个坏消息.
我看不出 getSaxonConfig()
做了什么,但我猜如果你改变
Configuration configuration = new Configuration();
至
Configuration configuration = getSaxonConfig();
那么问题就迎刃而解了。