首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否将存储为二进制的XML文档转换为XML?

是否将存储为二进制的XML文档转换为XML?
EN

Stack Overflow用户
提问于 2019-08-04 02:07:40
回答 1查看 272关注 0票数 3

我在MarkLogic中将大量内容保存为二进制格式的文档。当我解码文档时,它是XML。这个错误的副作用是我的搜索不包括这些文档。

有没有办法在现场转换文档的格式?如果不是,有没有办法进行某种质量转换?关于如何解决这个问题,有什么其他想法吗?

我知道如何列出二进制文档的所有URI:

代码语言:javascript
复制
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

我知道怎么破解这些文件:

代码语言:javascript
复制
xdmp:binary-decode(fn:doc($uri)/node(), "UTF-8")

但我不知道在那之后该怎么做。我可以遍历$binary_uris列表并对其进行解码,但是如何获得结果并在批处理中覆盖现有文档呢?

EN

回答 1

Stack Overflow用户

发布于 2019-08-05 05:10:07

根据文档另存为binary()节点的方式,您可以先使用xdmp:quote(),然后使用xdmp:unquote()

下面是一个快速的概念证明,展示了如何将保存为二进制的内容重新转换为文本或XML:

代码语言:javascript
复制
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()节点替换为解码后的文档:

代码语言:javascript
复制
xdmp:node-replace($doc/node(), $doc-decoded)

您可以运行批处理作业,使用MarkLogic Java DMSDKCORB作业来选择这些文档并重新保存它们。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57340937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档