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
如果我们尝试在 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
.