如何替换 MarkLogic 中的节点?
How to replace a node in MarkLogic?
我需要使用 XML sheet.
的 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(只需更改查询类型)。我假设您需要将您的代码放入一个文件中,以便它成为您的应用程序的一部分,但是查询控制台中的 运行ning 是确定您需要什么代码的好方法。
就是说,您在评论中提供的代码混合了 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
);
在进一步讨论之前,我认为阅读 Server-side JavaScript introduction 会对您有所帮助。这将为您要实现的目标打下更好的基础。
编辑:
根据评论中的其他信息,解决方案是您正在使用的 JavaScript 代码旨在更新数据库,而您想在内存中进行读取转换(Guidelines for Writing Transforms). Based on Writing JavaScript Transformations,这是什么你想要:
function fromToSender(context, params, content)
{
var doc = content.toObject();
delete doc.note.from;
doc.sender = 'Jani';
return doc;
};
exports.transform = fromToSender;
请注意,这是一个带有名为 "fromToSender" 的转换的库模块。根据需要进行调整。
我需要使用 XML sheet.
的 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(只需更改查询类型)。我假设您需要将您的代码放入一个文件中,以便它成为您的应用程序的一部分,但是查询控制台中的 运行ning 是确定您需要什么代码的好方法。
就是说,您在评论中提供的代码混合了 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
);
在进一步讨论之前,我认为阅读 Server-side JavaScript introduction 会对您有所帮助。这将为您要实现的目标打下更好的基础。
编辑: 根据评论中的其他信息,解决方案是您正在使用的 JavaScript 代码旨在更新数据库,而您想在内存中进行读取转换(Guidelines for Writing Transforms). Based on Writing JavaScript Transformations,这是什么你想要:
function fromToSender(context, params, content)
{
var doc = content.toObject();
delete doc.note.from;
doc.sender = 'Jani';
return doc;
};
exports.transform = fromToSender;
请注意,这是一个带有名为 "fromToSender" 的转换的库模块。根据需要进行调整。