簡體   English   中英

如何替換MarkLogic中的節點?

[英]How to replace a node in MarkLogic?

我需要使用XML工作表的MarkLogic用新名稱替換現有節點。

我不使用查詢控制台,而是將所有代碼寫在.sjs文件中。 當我完成MarkLogic文檔中給出的步驟后,它會拋出一些錯誤。

樣例代碼:

<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

我必須更改標簽“ from”,並將其替換為“ sender”,即。 預期輸出:

<note>
  <to>Tove</to>
  <sender>Jani</sender>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

Java代碼:

從Java上傳sjs轉換

DatabaseClient client = DatabaseClientFactory.newClient(IP, 8000,
                           DATABASE_NAME, USERNAME, PWD, Authentication.DIGEST);

// get transform mgr
TransformExtensionsManager transMgr = client.newServerConfigManager()
    .newTransformExtensionsManager();
FileInputStream transStream = null;

try {
    transStream = new FileInputStream(path);
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
InputStreamHandle ipStreamHandle = new InputStreamHandle(transStream);
transMgr.writeJavascriptTransform(JS_TRANSFORM_NAME, ipStreamHandle);
client.release();

在從MarkLogic讀取數據之前應用轉換。 數據庫中的實際數據不會被更新

ServerTransform transform = new ServerTransform(transformName);
DatabaseClient client = DatabaseClientFactory.newClient(IP, 8000,
    DATABASE_NAME, USERNAME, PWD, Authentication.DIGEST);
JSONDocumentManager docMgr = clientNew.newJSONDocumentManager();
InputStreamHandle handle = new InputStreamHandle();
docMgr.read("/" + uri + JSON_EXT, handle, transform);
String document = handle.toString();
clientNew.release();
return document;

.sjs代碼:

declareUpdate();
var n = new NodeBuilder();
node = n.addElement("sender", "Jani").toNode();

xdmp.nodeReplace(
  cts.doc("/example.xml").xpath("/note/from"),
  node
);

錯誤:

Operation not allowed on the currently executing transaction with identifier declareUpdate

首先,請注意,您可以在查詢控制台中使用JavaScript(只需更改查詢類型)。 我假設您需要將代碼放入文件中,以便它將成為應用程序的一部分,但是在Query Console中運行是確定所需代碼的好方法。

也就是說,您在注釋中提供的代碼是XQuery和JavaScript的混合。 xdmp:document-insert()是XQuery -您可以看出這種情況,JavaScript不支持帶連字符的標識符。 xdmp:nodeReplace應該是xdmp:node-replace(XQuery)或xdmp.nodeReplace(JavaScript)。

您遇到的問題是XML不是JavaScript文件中的有效內容-<和>符號被解釋為小於和大於。 您可以使用以下代碼完成您要嘗試執行的操作:

declareUpdate();

var n = new NodeBuilder();
node = n.addElement("sender", "Jani").toNode();

xdmp.nodeReplace(
  cts.doc("/example.xml").xpath("/note/from"),
  node
);

在繼續之前,我認為您將受益於閱讀服務器端JavaScript簡介 這將為您要完成的工作提供更好的基礎。


編輯:根據注釋中的其他信息,解決方案是您要使用JavaScript代碼更新數據庫,同時又要在內存中進行讀取轉換( 編寫轉換指南 )。 根據編寫JavaScript轉換 ,下面是您想要的:

function fromToSender(context, params, content) 
{
  var doc = content.toObject();
  delete doc.note.from;
  doc.sender = 'Jani';
  return doc;
};

exports.transform = fromToSender;

請注意,這是一個帶有名為“ fromToSender”的轉換的庫模塊。 根據需要進行調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM