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

时间:2018-02-06 08:00:29

标签: marklogic marklogic-8

我有一个来自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?

1 个答案:

答案 0 :(得分:1)

来自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 TagSoup之类的工具来修复标记并将其转换为格式良好的XML。