marklogic - 将以二进制形式存储的 XML 文档转换为 XML?

标签 marklogic

我在 MarkLogic 中将一堆内容保存为二进制格式文档而不是 XML。当我解码文档时,它是 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 列表并对其进行解码,但我如何获取该结果并在批处理过程中覆盖现有文档?

最佳答案

根据您的文档如何保存为 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, "&lt;")) 
    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 DMSDKCORB作业来选择这些文档并重新保存它们。

关于marklogic - 将以二进制形式存储的 XML 文档转换为 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57340937/

相关文章:

super 数据库的 marklogic ml-gradle 配置

rest - 使用 MarkLogic REST API 将文件系统设置为模块数据库

marklogic - 在 marklogic 中搜索二进制文件

使用 XQuery 将 XML 转换为 CSV

marklogic - 是否可以在没有管理员角色的情况下在 MarkLogic 9 上使用 ml-gradle?

xml - Marklogic 中的 PDF 到 XML 转换

MarkLogic:无法更新主机名 - 等待重试

ssl - 由不受信任的机构颁发的证书链

gradle - 如何在 MarkLogic 中清除模块数据库

node.js - MarkLogic 8 - Node.js 客户端 API - 我可以执行 SPARQL 查询吗?