0

我正在尝试将新的 xml 文件与 basex 数据库('db')中的现有 xml 进行比较,但它仅检查 'db' 中是否存在该文件,并且无论内容是否相同,它都会返回 true。

我还想检查我传递的 xml 文件的内容以及数据库中匹配的 xml 文件('db')。所以如果内容相同,那么它应该返回'true',否则返回 false。

请任何人都可以帮助我提供最好的方法。

 String query = "for $doc in collection('db') return if(matches(document-uri($doc),'"+xmlFile+"')) then  true() else false()";
4

2 回答 2

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();
于 2014-07-17T08:05:16.987 回答
0
  • 您需要检索文档的集合。
  • matches用于将字符串与正则表达式进行比较,而不是 XML 内容。改为使用deep-equal

根据需要替换数据库/文件名:

let $new-document := doc('factbook.xml')
return
  some $document in collection('factbook')
  satisfies deep-equal($document, $new-document)

如果新文档等于任何已经可用的文档,这将返回 true。

于 2014-07-17T08:08:25.227 回答