我得到一个无效的 XQuery 语法,语法没有通过使用 java 的静态验证错误

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

我收到此错误:无效的 XQuery 语法,语法未通过静态验证。 eac4.gestor.GestorException 在 eac4.gestors.GestorOrdinador.inserir(GestorOrdinador.java:57) 在 eac4.gestors.TestGestor.bTestInserir(TestGestor.java:107) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

我正在做一个练习,我的教授提供了一些测试,我必须制作 5 种方法,并且他们的测试一个接一个地运行,如果一个失败,下面的也会失败。第一种方法必须删除 XML 文件中的所有内容(根标签“ordinadors”除外),我已经这样做了:

public static final String ARREL = "doc(\"ordinadors/ordinadors.xml\")/collection(\"ordinadors\")/";

public void eliminarTot() throws GestorException {
    try {
        XQExpression xqe = conn.createExpression();
        xqe.executeQuery("for $i in "+ ARREL + "ordinadors return delete node $i");
    } catch (XQException ex) {
        Logger.getLogger(GestorOrdinador.class.getName()).log(Level.SEVERE, null, ex);
    }
}

以下方法,也就是给出错误的方法,必须在该 XML 文件上插入一个对象:(简单解释:Utilitats.formaObjecteXML(ordinador) 返回一个将对象转换为 XML 类字符串的字符串)

public void inserir(Ordinador ordinador) throws GestorException {
    //TODO implementar mètode 
    String nom = ordinador.getNom(); 
    try { 
        XQExpression xqe = conn.createExpression(); 
        XQResultSequence xqrs = xqe.executeQuery(ARREL+"ordinadors/ordinador[nom="+nom+"]");

        if(xqrs.next()){ 
            throw new GestorException("this ordinador already exists"); 
        } else { 
            xqe.executeQuery("insert node "+Utilitats.formaObjecteXML(ordinador)+" into " +ARREL+"ordinadors"); 
        } 
    } catch (XQException ex) {
        throw new GestorException(ex.getMessage()); 
    } 
}

事实是我不明白语法哪里错了,还有这一行:at eac4.gestors.GestorOrdinador.inserir(GestorOrdinador.java:57) 指的是这一行:

} catch (XQException ex) {
    *throw new GestorException(ex.getMessage());*
}

我不知道该如何处理。也许 eliminarTot 方法有错误,或者它只是在 inserir...

随着测试 eliminarTot 的成功,我假设与 de DB (BASEX 10.5) 的连接正常,图书馆也正常,并且我正在按照教授的要求使用 JDK 11。 我们还被告知使用 XQUF 与来自 Netbeans 的数据库交互(强制)。 TY所有。

java xml database xquery basex
2个回答
0
投票

我创建了一个示例 XML 文件:'e:\Temp\ordinadors.xml'

<ordinadors>
    <ordinador>1</ordinador>
    <ordinador>18</ordinador>
</ordinadors>

在命令提示符下手动设置 BaseX 10.5 设置:

set STRIPWS true

供参考:STRIPWS

或者以编程方式,直接在 XQuery 中。见下文。

XQuery

xquery version "3.1" encoding "UTF-8";

declare base-uri 'e:\Temp\';
(: https://docs.basex.org/wiki/XQuery_Extensions#Pragmas :)
declare option db:stripws "true";

copy $input := doc("ordinadors.xml")
modify delete node $input/ordinadors/*
return $input

输出

<ordinadors/>

0
投票

最后我发现了我的错误,在“eliminarTot()”方法(删除根标签内的每个节点)我改变了查询:

xqe.executeQuery("for $i in "+ ARREL + "ordinadors return delete node $i");
到:
xqe.executeQuery("delete node "+ ARREL + "ordinadors/ordinador");
这样根标签就不会被删除。 同样在“inserir()”方法中我有另一个错误我改变了:
XQResultSequence xqrs = xqe.executeQuery(ARREL+"ordinadors/ordinador[nom="+nom+"]");
到:
String resultat = xqe.executeQuery(ARREL+"ordinadors/ordinador[@id="+id+"]").getSequenceAsString(null);
然后检查:

if(resultat.isEmpty()){
            xqe.executeQuery("insert node 
"+Utilitats.formaObjecteXML(ordinador)+" into "+ARREL+"ordinadors");

就这些了。 TY 你的答案 Yitzhak Khabinsky :D

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