【问题标题】:Why is MarkLogic Definitely Storing Invalid Characters in XML Documents?为什么 MarkLogic 肯定会在 XML 文档中存储无效字符?
【发布时间】:2019-08-11 10:00:00
【问题描述】:

我发现可以在 MarkLogic 数据库的 XML 文档中存储无效的 XML 字符,当我尝试更新文档中的文本时,当涉及到需要引用和取消引用 XML 数据时,这会导致问题。

我现在有示例代码证明可以存储无效数据。您可以从 Query Console 运行此命令,但在尝试取消引号字符串时会出现错误,因为引号字符串包含“”,它是从存储在数据库中的 XML 生成的。

let $Doc := <TEST>Here is invalid character 14: {fn:codepoints-to-string((14))}</TEST>
return
  xdmp:document-insert("/Test.xml", $Doc)

;

let $Quoted := xdmp:quote(/TEST)
let $Unquoted := xdmp:unquote($Quoted)
return
  $Unquoted

【问题讨论】:

  • 您使用的是哪个版本的 MarkLogic?当我尝试运行该脚本时,MarkLogic 9 在插入语句中引发错误:XDMP-CODEPOINT: (err:FOCH0001) fn:codepoints-to-string(14) -- Codepoint not legal
  • 如果我理解正确,这是对stackoverflow.com/questions/57434493/… 的跟进。如果是这样,最好编辑原始帖子,以便讨论集中在一个地方。
  • 我使用的是 9.0-9。当我运行它时,我收到以下消息: [1.0-ml] XDMP-DOCCHARREF: xdmp:unquote("Here is invalid character 14: &#14;") -- Invalid character reference "14 " 在第 1 行我似乎无法包含屏幕截图,所以我只能描述 Query Console 也以红色显示第 8 行,其中 xdmp:unquote 语句突出显示,所以它没有抱怨文档的插入,确实可以查看数据库中的文档。
  • 补充一下,作为三重检查,我从datase中读回测试文件的内容并输出codepoints,可以看到最后一个字符是“14”:72 101 114 101 32 105 115 32 105 110 118 97 108 105 100 32 99 104 97 114 97 99 116 101 114 32 49 52 58 32 14

标签: marklogic


【解决方案1】:

MarkLogic 是Document database,而不仅仅是一个 XML 数据库,因此它不对您插入的数据做任何假设,即使文档 URI 具有 xml 扩展名或者您正在对现有 XML 文档进行节点插入。

这也意味着它将接受带有无效字符的 xml。 xdmp:node-insert-child() 可以与 xml 和 json 一起使用,因此您可以在摄取时清理/验证数据,或者在检索时处理异常。

Schemas are one method that can be used for document validation.

您也可以explicitly specify the XML version in a document:

对接受的 XML 字符集的更改

从 MarkLogic 9.0-6 开始,使用 XML 解析 XML 文档 明确指定 XML 版本 1.1 (version="1.1") 的声明 强制使用 XML 1.1 字符集。因此,您现在可以创建 包含 XML 1.0 不接受的字符的内容。

XML 1.1 受限字符范围内的字符必须为 字符实体。本强制适用于以下情况 字符范围:

0x1-0x8 0xB-0xC 0xE-0x1F 0x7F-0x84 0x86-0x9F 以下字符 以前不允许的范围现在被接受了。

0x1-0x8 0xB-0xC 0xE-0x1F

【讨论】:

  • 嗯,好的,所以您是说最初作为 XML 数据库开发的 MarkLogic(无论它现在如何称呼自己),都乐于存储无效的 XML 文档。很高兴知道:-)
  • 我将支持另一个问题的建议:提交支持票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2016-08-31
相关资源
最近更新 更多