【问题标题】:compare two xml file contents using xquery in java在java中使用xquery比较两个xml文件内容
【发布时间】:2014-07-17 07:07:08
【问题描述】:

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

【问题讨论】:

    标签: java xml xquery basex


    【解决方案1】:

    使用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();
    

    【讨论】:

    • 这不仅“不优雅”,而且不安全。您对代码注入攻击持开放态度。
    • @MichaelKay 我完全同意。但是,到目前为止,我还没有看到任何 XQuery 注入攻击,由于 XQuery 的功能性质,这对我来说似乎并不简单(尽管它肯定是可能的)。不过,我希望看到一些实用的 XQuery 代码注入攻击。
    • 当 W3C 首次安装“运行您自己的 XSLT 代码”网站时,我很快确定它使用的是 XT 处理器,没有禁用对 Java 的调用,并且可以探索服务器的完整目录结构并显示或修改任何文件的内容。如果您不小心,XQuery 注入可能会完全一样。
    • 嗨 dirkk,假设我创建了 xml 而不存储任何目录,如何将此 xml 文件与数据库中现有的 xml 文件进行比较。上面示例中的 B/c 我正在创建 xml 并将其存储在某个目录中,然后我从目录中获取文件并与数据库中的 xml 文件进行比较,但现在我不想存储在任何目录中。所以我只想动态创建xml文件并进行比较。
    • @manishpayasi 我真的不明白你想要做什么。什么是目录?你的意思是数据库还是路径?我不确定。但是,最好简单地提出一个新问题,因为它似乎与这个问题完全不同。
    【解决方案2】:
    • 您需要检索文档集合。
    • matches 用于将字符串与正则表达式进行比较,而不是 XML 内容。请改用deep-equal

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多