MarkLogic XML到JSON的转换

MarkLogic XML到JSON的转换,marklogic,Marklogic,我正在尝试将此XML文件转换为JSON,但无法获得任何成功。我的XML中有两个子元素,但它只返回最后一个。如何以JSON格式获取这两个记录 XML <Carousel> <Video> <Title>1</Title> <Abstract>3</Abstract> <FileName type="custom" mediatype="image">D</FileName>

我正在尝试将此XML文件转换为JSON,但无法获得任何成功。我的XML中有两个子元素,但它只返回最后一个。如何以JSON格式获取这两个记录

XML

 <Carousel>
  <Video>
    <Title>1</Title>
    <Abstract>3</Abstract>
    <FileName type="custom" mediatype="image">D</FileName>
    <HasAccess>4</HasAccess>
  </Video>
  <Video>
    <Title>1</Title>
    <Abstract>2</Abstract>
    <FileName type="custom" mediatype="image">D</FileName>
    <HasAccess>3</HasAccess>
  </Video>
</Carousel>
电流输出:

import module namespace json = "http://marklogic.com/xdmp/json"  at "/MarkLogic/json/json.xqy";

let $custom := let $config := json:config("custom")
           return 
             (
              map:put( $config, "whitespace", "ignore" ),

              $config
             )
let $XML := $XMLFile (: XML content :)
return json:transform-to-json($XML,$custom)
{"Carousel":{"Video":{"Title":"1", "Abstract":"2", "FileName":{"type":"custom", "mediatype":"image", "_value":"D"}, "HasAccess":"3"}}}
我还尝试了默认的“基本”JSON设置
JSON:transform-to-JSON($XML)
,但出现了如下错误

XML Element not in expected namespace [http://marklogic.com/xdmp/json/basic] (json:INVALIDELEM): Carousel
它只在“完整”模式下工作,但它添加了一些JSON格式的额外信息,如_属性等,这在我的输出JSON中是不需要的


请帮助我或者告诉我为什么它没有返回JSON格式的完整输出。

您需要将重复元素标记为数组元素,以供初学者使用。这似乎有效:

xquery version "1.0-ml";

import module namespace json = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";

let $xml := <Carousel>
  <Video>
    <Title>1</Title>
    <Abstract>3</Abstract>
    <FileName type="custom" mediatype="image">D</FileName>
    <HasAccess>4</HasAccess>
  </Video>
  <Video>
    <Title>1</Title>
    <Abstract>2</Abstract>
    <FileName type="custom" mediatype="image">D</FileName>
    <HasAccess>3</HasAccess>
  </Video>
</Carousel>

let $custom :=
  let $config := json:config("custom")
  let $_ := map:put( $config, "whitespace", "ignore" )
  let $_ := map:put( $config, "array-element-names", "Video" )
  return $config

return json:transform-to-json($xml,$custom)
xquery版本“1.0-ml”;
导入模块名称空间json=”http://marklogic.com/xdmp/json“at”/MarkLogic/json/json.xqy”;
让$xml:=
1.

这里的文档

回顾一下这个概念,但它经常忽略了策略的基本差异,它们是为不同的用例设计的

默认(“基本”)策略专门用于获取任意JSON并转换为“黑盒”XML,然后以100%的保真度返回

“完整”策略的定义正好相反,即获取任意XML并转换为“黑盒”JSON格式,然后以尽可能高的保真度返回(在此过程中会丢失一些XML功能)

这两者都不是为了控制(或关注)目标格式, 而且它们不打算(或不起作用)对目标格式进行任何更改

如果您希望对源格式和目标格式进行某种控制,“自定义”策略 设计用于以“自定义”方式控制转换。 另一方面,结果是您对JSON和XML格式有了更多的控制, 以一种或另一种格式生成“良好”结果所需的简化需要对模式或数据进行假设,但这些假设并不总是正确的。配置参数有助于控制这一点, 但最终由于XML和JSON数据模型的不匹配,这通常是不可能实现的 能够创建一个非常适合文档a和文档B的转换,而不会使配置过于复杂,因此最好立即对其进行编码。
因此,考虑“自定义”转换是一种妥协,旨在轻松满足大量的共同模式,但可能不是你想要的。您可以通过在需求(XML或JSON格式)中增加一点灵活性来扩展范围或者通过添加预处理或后处理步骤将数据转换为更接近自定义格式的格式。

是否可以在JSON中将所有重复元素标记为数组,而不提及
数组元素名称中的所有元素。在我的例子中,将有200多个元素,任何元素都可以出现多次。如果所有元素都是可重复的,那么最终将得到一个非常复杂的JSON结构,其中每个字段都是一个包含数组的对象数组。。。实际上,有一些方法可以提供一个函数而不是数组元素名的映射,它没有文档记录,但是json:transform xxx完全在Modules目录中的xquery中实现。你可以看到它的作用。建议:如果XML内容如您所示,那么使用“完整”策略将更容易——这将处理几乎任意的XML。结果有点“臃肿”,但您的数据集无论如何都需要这样做。