在java中使用xquery比较两个xml文件内容

时间:2014-07-17 07:07:08

标签: java xml xquery basex

我正在尝试将新的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()";

2 个答案:

答案 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。