MarkLogic XML到JSON的转换

时间:2014-11-11 05:54:22

标签: marklogic

我正在尝试将此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>

XQUERY:

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格式的额外信息,如_attribute等,这在我的输出JSON中是不需要的。

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

2 个答案:

答案 0 :(得分:5)

您需要将重复元素标记为初学者的数组元素。这似乎有效:

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)

如果您愿意,也可以抑制属性。配置支持各种选项,我建议查看其文档:

http://docs.marklogic.com/json:config

HTH!

答案 1 :(得分:1)

这里的文档 http://docs.marklogic.com/json/json

回顾一下这个概念,但它常常忽略了策略中存在基础差异,它们是针对不同的用例而设计的。

默认(&#34;基本&#34;)策略专门设计用于获取任意JSON并转换为“黑盒子”&#39; XML和100%保真度。

&#34;完整&#34;策略是反过来的,取任意XML并转换为一个黑盒子&#39; JSON格式,并且具有高达合理的保真度(在此过程中会丢失一些XML功能)。

这些都不是针对目标格式的任何控件(或关注点), 并且他们不打算(或工作)目标格式的任何变化。

如果您希望对源格式和目标格式进行一些控制,那么&#34; custom&#34;战略 旨在控制“定制”中的转型。办法。 结果是,您可以更好地控制JSON和XML格式,另一方面, 生产&#34; nice&#34;所需的简化以一种格式或另一种格式的结果需要关于模式或数据的假设并非总是如此。配置参数有助于控制这一点, 但最终由于XML和JSON数据模型的不匹配,通常是不可能的 能够创建一个非常适合文档A和文档B的转换,而不会使配置变得如此复杂,以至于您可以更好地对其进行编码。 所以考虑一下&#34; custom&#34;转换旨在轻松满足大量常见模式的折衷方案,但可能并不完全符合您的要求。您可以通过在需求(XML或JSON格式)中稍微灵活一些,或者通过添加pre或post processng步骤将数据转换为更接近自定义格式可以处理的格式来扩展范围。