我在MarkLogic中将大量内容保存为二进制格式的文档。当我解码文档时,它是XML。这个错误的副作用是我的搜索不包括这些文档。
有没有办法在现场转换文档的格式?如果不是,有没有办法进行某种质量转换?关于如何解决这个问题,有什么其他想法吗?
我知道如何列出二进制文档的所有URI:
xquery version "1.0-ml";
declare namespace qry = "http://marklogic.com/cts/query";
let $binary-term :=
xdmp:plan(/binary())//qry:term-query/qry:key/text()
let $binary_uris := cts:uris((), (), cts:term-query($binary-term))
return $binary_uris我知道怎么破解这些文件:
xdmp:binary-decode(fn:doc($uri)/node(), "UTF-8")但我不知道在那之后该怎么做。我可以遍历$binary_uris列表并对其进行解码,但是如何获得结果并在批处理中覆盖现有文档呢?
发布于 2019-08-05 05:10:07
根据文档另存为binary()节点的方式,您可以先使用xdmp:quote(),然后使用xdmp:unquote()。
下面是一个快速的概念证明,展示了如何将保存为二进制的内容重新转换为文本或XML:
xquery version "1.0-ml";
xdmp:document-insert("/test.xml",
binary{ xs:hexBinary(xs:base64Binary(xdmp:base64-encode(xdmp:quote(<doc>test</doc>))))}),
xdmp:document-insert("/test.txt",
binary{ xs:hexBinary(xs:base64Binary(xdmp:base64-encode(xdmp:quote("test" ))))})
;
for $ext in ("xml", "txt")
let $doc := doc("/test." || $ext)
where $doc/node() instance of binary()
(: you could also restrict to docs who's URIs end with .xml, .txt, etc :)
return
let $doc-text := xdmp:quote($doc)
let $doc-decoded :=
if (fn:starts-with($doc-text, "<"))
then xdmp:unquote($doc-text)
else $doc-text
return
$doc-decoded
;
xdmp:document-delete("/test.xml"),
xdmp:document-delete("/test.txt")如果您想“修复”文档,那么可以使用xdmp:node-replace()将binary()节点替换为解码后的文档:
xdmp:node-replace($doc/node(), $doc-decoded)您可以运行批处理作业,使用MarkLogic Java DMSDK或CORB作业来选择这些文档并重新保存它们。
https://stackoverflow.com/questions/57340937
复制相似问题