我有一个日志需求来存储数据库中某个文档(中等复杂)的某个部分发生更改时旧值和新值之间的差异。只有变更的数据应该报告。我当前的解决方案工作得很好,但我担心这不是最优的,并且在更新开始发生时可能会导致性能问题。在Marklogic中,我怎样才能高效地深入比较两个xml文档?
我目前的解决方案看起来大多是这样的:
for $element in $data/section//element()[text()]
return
if (not($old-data//*[fn:name() = fn:name($element) and text() = $element/text()])) then
element log:difference {
...
}
else()
我的问题是,探查显示该采取的(相对)长的时间做比较的数千//*[fn:name() = fn:name($element)]
结构导致。它只有几十毫秒,但有很多更新会加起来,感觉应该有办法避免它。
xml的结构已被充分定义好,我可以确定一个文档中的字段与另一个文档中的字段具有相同的相对xpath,因此在技术上可以删除我使用的//
,代价是手动走xml树,但这是一个合理的复杂性和结构相当平坦,所以我不知道它会更有效率。
此外,文档的这一部分有一组有限的字段,因此手动比较每个字段(使用完全限定的xpaths)将是一个选项,但我宁愿避免它,因为最好在将来不需要重新访问这些代码,如果该字段列表发生变化。
解决方案是沿着这些路线走,还是有更明显的东西我错过了?
有没有什么办法可以直接使用元素名称的字符串值构造xpath而无需使用谓词?我假设这会更有效,因为xpath评估通常不会持续这么长时间。
我可以,也许,提取一个元素的相对xpath,然后看看在另一个文档中的确切位置?
我是否缺少marklogic本身的内置xml比较工具?
为了记录,我发现您可以使用'xdmp:value()'在当前作用域中将任意字符串评估为xquery(包括xpath)。 – 2013-03-07 16:40:54