У меня есть требование регистрации для хранения различий между старыми и новыми значениями, когда в нашей базе данных изменяется (умеренно сложный) раздел документа. Следует сообщать только об измененных данных. Мое текущее решение работает достаточно хорошо, но я обеспокоен тем, что он не является оптимальным и может вызвать проблемы с производительностью при появлении обновлений в томе.В 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 элемента, а затем посмотреть на это точное место в другом документе?
У меня отсутствует встроенный инструмент сравнения xml в самой marklogic?
Для записи я обнаружил, что вы можете оценить произвольную строку как xquery (включая xpath) в текущей области с помощью 'xdmp: value()'. –