You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MarkLogic插入XML时,如何保留十六进制字符实体?

如何在MarkLogic中保留XML的十六进制字符实体

首先得明确问题核心:MarkLogic遵循XML规范,在解析XML文档时会自动解析所有字符实体,将其转换为对应的Unicode字符。当你后续导出文档时,默认序列化也会直接输出这些Unicode字符,而非原始的实体格式。要保留实体,得从存储或序列化的环节入手,以下是几种实用解决方案:

方法1:以二进制格式存储文档

如果你的XML不需要MarkLogic做结构化查询、索引这类处理,直接把它当作纯二进制文件存储是最简单的方式。这样MarkLogic不会解析XML内容,所有原始字符实体都会原封不动保留。

用xdmp:document-insert时指定格式为binary即可:

xdmp:document-insert(
  "/your/doc/path.xml",
  xdmp:binary(xdmp:quote($your-xml-content)),
  (),
  "binary"
)

后续下载时,你拿到的就是和原始文档完全一致的内容,包括所有十六进制实体。

方法2:用CDATA段包裹实体内容

如果还需要MarkLogic处理XML的结构,但要保留实体,可以把包含实体的文本放在CDATA段里。XML解析器会跳过CDATA内部的内容解析,所以实体不会被转换:

修改你的XML节点为:

<copyright-holder><![CDATA[&#x00A9; 2015 &#x2014; All rights reserved &#x00A9; Standards Australia Limited]]></copyright-holder>

注意:这种方式下,CDATA里的内容会被当作纯文本节点,如果你需要对这段内容做全文检索或文本处理,可能需要额外的逻辑来处理CDATA。

方法3:自定义序列化参数(导出时还原实体)

如果需要保留XML的结构化存储,同时在导出时让实体显示出来,可以通过自定义序列化选项来实现。你可以指定字符映射,把特定Unicode字符转回对应的十六进制实体:

比如用xdmp:serialize时配置字符映射:

let $entity-map := map:map()
let $_ := map:put($entity-map, "©", "&#x00A9;")
let $_ := map:put($entity-map, "—", "&#x2014;")
return xdmp:serialize(
  doc("/your/doc/path.xml"),
  <options xmlns="xdmp:serialize">
    <character-map>{$entity-map}</character-map>
    <method>xml</method>
  </options>
)

这种方法适合需要兼顾XML结构处理和实体输出的场景,灵活性很高。

方法4:预转义实体的&符号

在插入文档前,把实体中的&转义为&amp;,这样XML解析器会把&amp;#x00A9;解析成文本节点&#x00A9;,而不是转换为©:

修改原始XML为:

<copyright-holder>&amp;#x00A9; 2015 &amp;#x2014; All rights reserved &amp;#x00A9; Standards Australia Limited</copyright-holder>

插入后,文档中的文本内容就是&#x00A9;,后续导出序列化时就会输出这个实体格式的文本。

内容的提问来源于stack exchange,提问作者Navin Rawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:55