我正在尝试将新的xml文件与basex数据库('db')中的现有xml进行比较,但它仅检查'db'中是否存在该文件,并且无论内容是否相同,它都返回true。
我还想检查我在数据库('db')中匹配的xml文件传递的xml文件的内容。所以如果内容相同则应该返回'true',否则为false。
请任何人帮我提供最好的方法。
String query = "for $doc in collection('db') return if(matches(document-uri($doc),'"+xmlFile+"')) then true() else false()";
答案 0 :(得分:0)
使用fn:deep-equal()
。它比较两个序列并检查它们是否具有相同的值和相同的顺序。
for $doc in collection('db') return deep-equal($doc, doc('"+xmlFile+"'))
此外,传递变量并不像在这里那样优雅。在XQuery中将变量声明为外部并将其绑定到Java代码中要好得多。它看起来像这样:
Context context = new Context();
String query = "declare variable $xml-file as xs:string external;" +
"for $doc in collection('db') return deep-equal($doc, doc($xml-file))";
QueryProcessor proc = new QueryProcessor(query, context);
proc.bind("xml-file", xmlFile);
Result result = proc.execute(); // your result
proc.close();
context.close();
答案 1 :(得分:0)
matches
用于将字符串与正则表达式进行比较,而不是XML内容。请改用deep-equal
。根据需要替换数据库/文件名:
let $new-document := doc('factbook.xml')
return
some $document in collection('factbook')
satisfies deep-equal($document, $new-document)
如果新文档等于任何已有文档的,则返回true。