我不是XQuery专家。知道足够了解。最近,我已经将非常Xquery的执行代码从Saxon 8.4迁移到9.9.1.2。因此,我对XQ文件的执行方式做了一些更改。该代码没有错误,但在运行时出现异常:
java.lang.IllegalArgumentException:提供的节点必须使用相同或兼容的配置
我为运行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
),即使它们完全起作用,它们也不再是最佳实践。 s9api接口是在9.1左右引入的,更加实用且稳定。
但是,错误是因为您有多个Saxon Configuration
对象。我看不到到底发生了什么,因为您还没有向我们展示完整的图片,但是当必须已经有一个new Configuration()
调用来访问时,创建一个getSaxonConfig()
似乎是个坏消息。
我看不到getSaxonConfig()
的功能,但我想是如果您更改
Configuration configuration = new Configuration();
to
Configuration configuration = getSaxonConfig();
然后问题将消失。