如何转义 MarkLogic 中 xml 字符串中的特殊字符?

How to escape special characters present in xml string in MarkLogic?

我有一个来自 Java 的 XML 字符串,采用 base64 编码格式。

PHJvb3Q+PGNoaWxkPiY8L2NoaWxkPjxjaGlsZD48PC9jaGlsZD48Y2hpbGQ+PjwvY2hpbGQ+PGNoaWxkPns8L2NoaWxkPjxjaGlsZD59PC9jaGlsZD4vcm9vdD4=

我使用xdmp:base64-decode()对其进行解码。它给我输出

<root><child>&</child><child><</child><child>></child><child>{</child><child>}</child>/root>

输出是一个字符串。为了将其转换为 XML,我使用 xdmp:unquote(),但此处出现的特殊字符会产生错误。

我也尝试将 repair-full 选项与 xdmp:unquote() 一起使用,但没有解决问题。

注意:我的实际数据中存在一些特殊字符,这些字符会导致一些不需要的错误。

如何处理这种情况以在 MarkLogic 中插入 XML?

来自该 base64 编码字符串的文本格式不正确 XML。除了 &< 编码不正确之外,root 元素的结束标记也缺失 <。在字符串的末尾,</child>/root> 应该是 </child></root>.

作为如何可能擦除文本并修复它的示例,下面的代码将修复这个特定的解码值,然后使用 xdmp:unquote() 解析为 XML:

xdmp:unquote(
 replace(
  replace(
   replace(
     xdmp:base64-decode("PHJvb3Q+PGNoaWxkPiY8L2NoaWxkPjxjaGlsZD48PC9jaGlsZD48Y2hpbGQ+PjwvY2hpbGQ+PGNoaWxkPns8L2NoaWxkPjxjaGlsZD59PC9jaGlsZD4vcm9vdD4=")
   ,"&amp;", "&amp;amp;")
  ,"&gt;&lt;&lt;", "&gt;&amp;lt;&lt;")
 ,"/root>", "&lt;/root>")
)

它产生以下格式正确的 XML:

<root>
  <child>&</child>
  <child><</child>
  <child>></child>
  <child>{</child>
  <child>}</child>
</root>

但是,这种修复很乏味并且会变得困难。最好使用 TagSoup 等工具来修复标记并将其变成格式正确的 XML。