XQuery Saxon异常(java.lang.IllegalArgumentException)

问题描述 投票:0回答:1

我不是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文档也没有太多可供我学习的示例。任何帮助,将不胜感激。谢谢!

java xquery saxon xqj
1个回答
0
投票

从8.4起,您正在使用API​​类和方法(例如StaticQueryContextDynamicQueryContext),即使它们完全起作用,它们也不再是最佳实践。 s9api接口是在9.1左右引入的,更加实用且稳定。

但是,错误是因为您有多个Saxon Configuration对象。我看不到到底发生了什么,因为您还没有向我们展示完整的图片,但是当必须已经有一个new Configuration()调用来访问时,创建一个getSaxonConfig()似乎是个坏消息。

我看不到getSaxonConfig()的功能,但我想是如果您更改

Configuration configuration = new Configuration();

to

Configuration configuration = getSaxonConfig();

然后问题将消失。

© www.soinside.com 2019 - 2024. All rights reserved.