Обновление одного или нескольких значений с помощью патча MarkLogi c - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь использовать функциональность патча MarkLogi c (в версии 9.0-9.1), чтобы иметь возможность редактировать один или несколько элементов документа. В приложении у пользователя будет экран, заполненный исходными значениями, и он сможет редактировать одно или несколько полей, а затем сохранять изменения.

У меня есть такой документ:

<root>
    <value1>original value</value1>
    <value2>original value</value2>
    <value3>original value</value3>
    <value4>original value</value4>
    <value5>original value</value5>
</root>

Я пытаюсь обновить его, используя это (с одним или несколькими значениями отредактированного содержимого):

<rapi:patch xmlns:rapi="http://marklogic.com/rest-api">
    <rapi:replace-insert context="/root" select="value1">original value</rapi:replace-insert>
    <rapi:replace-insert context="/root" select="value2">original value</rapi:replace-insert>   
    <rapi:replace-insert context="/root" select="value3">edited content</rapi:replace-insert>
    <rapi:replace-insert context="/root" select="value4">original value</rapi:replace-insert>
    <rapi:replace-insert context="/root" select="value5">original value</rapi:replace-insert>   
</rapi:patch>

Однако, если каждое поле не имеет нового содержимого, я получаю следующую ошибку:

2020-01-29 21:25:37.425 Info: Status 500: RESTAPI-INVALIDREQ: (err:FOER0000) Invalid request:  reason: invalid patch for uri /FILE0000026.xml: replace-insert without apply or content: /root

Есть ли способ изменить одно или несколько значений в одном запросе без динамического обновления исправления, чтобы применять его только к измененным значениям

1 Ответ

4 голосов
/ 30 января 2020

Конечная точка PATCH ожидает, что замены будут заключены в элемент контейнера. Если вы хотите вставить простой текст, вы используете <rapi:text>original value</rapi:text>, иначе элемент по вашему выбору. Обратите внимание, что вы заменяете элемент, поэтому вы, вероятно, захотите либо обернуть содержимое элемента, либо использовать дочерние элементы в качестве контекста, а text() в качестве выбора. Что-то вроде:

  <rapi:patch xmlns:rapi="http://marklogic.com/rest-api">
    <rapi:replace-insert context="/root/value1" select="text()">
      <rapi:text>original value</rapi:text>
    </rapi:replace-insert>
    <rapi:replace-insert context="/root/value2" select="text()">
      <rapi:text>original value</rapi:text>
    </rapi:replace-insert>   
    <rapi:replace-insert context="/root/value3" select="text()">
      <rapi:text>edited content</rapi:text>
    </rapi:replace-insert>
    <rapi:replace-insert context="/root/value4" select="text()">
      <rapi:text>original value</rapi:text>
    </rapi:replace-insert>
    <rapi:replace-insert context="/root/value5" select="text()">
      <rapi:text>original value</rapi:text>
    </rapi:replace-insert>   
  </rapi:patch>

См. Также наше руководство по разработке приложений REST: https://docs.marklogic.com/guide/rest-dev/documents#id_74834

HTH!

...