【问题标题】:Convert XML document stored as binary to XML?将存储为二进制的 XML 文档转换为 XML?
【发布时间】:2019-12-11 22:26:27
【问题描述】:

我在 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 的列表并对其进行解码,但是如何获取该结果并在批处理中覆盖现有文档?

【问题讨论】:

    标签: marklogic


    【解决方案1】:

    根据您的文档保存为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 作业来选择这些文档并重新保存它们。

    【讨论】:

    • 我已经有了第一部分的代码(如何找到文档以及如何解码它们),但我没有考虑过使用 DMSDK 和 node-replace;谢谢,这将有助于一堆。
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 2017-02-17
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多