Marklogic CoRB 工具未以 UTF-8 格式保存 XML 个文件

Marklogic CoRB tool is not saving XML files in UTF-8 format

如果我们尝试在 xdmp:save 函数的帮助下从 Marklogic 中保存 XML,它会以 UTF-8 格式保存文件。

现在,如果我们尝试借助 Marklogic CoRB 工具保存同一个文件,它会将文件保存为 ANSI 格式而不是 UTF-8。

为什么?

XQuery 代码下方通过 Marklogic Qconsole 以 UTF-8 格式 XML 保存 XML 文件。

xquery version "1.0-ml";

let $data := fn:collection('00-2346447146')/metadata

return xdmp:save("E:\ML_CoRB_Tool\DD-7759627900-test\Report[=11=]-2346447146-1.xml", $data)

虽然在 marklogic CoRB 工具 PROCESS-MODULE xquery 代码下方以 ANSI 格式保存相同的 XML 文件 XML:

xquery version "1.0-ml";
declare variable $URI external;
declare variable $SCR-database-name    := 'SCR'
let $scr-data:= xdmp:eval('xquery version "1.0-ml";
                           declare variable $URI external; 
                           let $UPI := fn:replace($URI, ".xml", "") 
                            let $scr-metadata := cts:search(collection("scr-asset"), cts:element-range-query(xs:QName("SAPID"), "=", xs:int($UPI)))
                            let $assetID := $scr-metadata/metadata/assetIdentifiers/assetIdentifier/AssetID
                            return
                              try
                              {
                              if ($scr-metadata)
                              then $scr-metadata
                              else <doc-not-found>{fn:concat("DOC-NOT-PRESENT for UPI: ", $UPI)}</doc-not-found>
                              }
                               catch($x)
                               {
                                  (
                                  xdmp:log("============Transform error ============="),
                                  xdmp:log($x),
                                  <error>{fn:concat("ERROR in UPI:", $UPI," Assetid: ",$assetID)}</error>
                                  )
                               }'
                  , (xs:QName("URI"), $URI),
                <options xmlns="xdmp:eval">
                <database>{xdmp:database($SCR-database-name)}</database>
                </options>
                )
return
if ($scr-data/metadata) then $scr-data else ()  

我们使用以下 ML CoRB 工具属性:

THREAD-COUNT=8
MODULE-ROOT=/
MODULES-DATABASE=.\test\XQuery\PROD-Metadata
URIS-FILE=.\test\Input\assets_for_extraction_from_scr_20220121.csv
PROCESS-MODULE=.\test\XQuery\new-query.xqy|ADHOC
EXPORT-FILE-DIR=.\test\Report
URIS_BATCH_REF='URIS_BATCH_REF'
LOADER-SET-URIS-BATCH-REF=true
EXPORT-FILE-URI-TO-PATH=false
PRE-BATCH-TASK=com.marklogic.developer.corb.PreBatchUpdateFileTask
PROCESS-TASK=com.marklogic.developer.corb.ExportToFileTask
POST-BATCH-TASK=com.marklogic.developer.corb.PostBatchUpdateFileTask
DECRYPTER=com.marklogic.developer.corb.JasyptDecrypter

CoRB 任务使用方法 getValueAsBytes() 调用:

item.asString().getBytes();

Java字符串getBytes()方法:

Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.

因此,看起来它应该明确要求写入 UTF_8 个编码字节,而不是依赖于平台字符集:

item.asString().getBytes(StandardCharsets.UTF_8);

我有 filed an issue 并进行了调整。

同时,正如@David Ennis 所建议的,您可以通过设置系统 属性 -Dfile.encoding=UTF-8.

将默认文件编码设置为 UTF-8