我收到此错误:无效的 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所有。
我创建了一个示例 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/>
最后我发现了我的错误,在“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