首页 > 解决方案 > Marklogic json:config 生成“_children”

问题描述

我不明白为什么 Marklogic json:config 会生成“_children”。如何排除“_children”。我看到所有枚举的孩子都回来找父母,但 JSON 输出中有很多额外的垃圾。

let $config := json:config("custom")
let $_ := map:put( $config, "full-element-names",xs:QName("Nav:keynavlist")

json输出:

"Navigators": {
  "keynavlist": {
  "_children": [
     {
      "keynav": {
          "_value": "Fuel Cells"
      }
    }, 
 {
    "keynav": {
        "_value": "Microorganisms"
}
}, 
{
  "keynav": {
 "_value": "Waste Treatment"
}

标签: marklogic

解决方案


我猜你想得到类似的东西:

{
    "Navigators": {
        "keynavlist": [{
            "keynav": "Fuel Cells"
        }, {
            "keynav": "Microorganisms"
        }, {
            "keynav": "Waste Treatment"
        }]
    }
}

但最接近您可以使用 json 转换库的是:

{
    "Navigators": {
        "keynavlist": {
            "keynav": ["Fuel Cells", "Microorganisms", "Waste Treatment"]
        }
    }
}

使用:

xquery version "1.0-ml";

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

let $config := json:config("custom")
let $_ := map:put($config, "array-element-names", ("keynav"))
return json:transform-to-json(
  <Navigators>
    <keynavlist>
      <keynav>Fuel Cells</keynav>
      <keynav>Microorganisms</keynav>
      <keynav>Waste Treatment</keynav>
    </keynavlist>
  </Navigators>,
  $config
)

考虑使用递归函数构建 json,可能是这样的:

declare function local:xml-to-json($nodes) {
  for $node in $nodes
  return typeswitch ($node)
    case element() return
      if ($node/attribute() or ($node/element() and $node/text())) then
        object-node {
          local-name($node): object-node {
            "@": array-node{ local:xml-to-json($node/attribute()) },
            "_": array-node { local:xml-to-json($node/node()) }
          }
        }
      else
        object-node {
          local-name($node): array-node{ local:xml-to-json($node/node()) }
        }
    case attribute() return
      object-node {
        local-name($node): data($node)
      }
    default return $node
};

local:xml-to-json(
  <Navigators>
    <keynavlist>
      <keynav>Fuel Cells</keynav>
      <keynav>Microorganisms</keynav>
      <keynav>Waste Treatment</keynav>
    </keynavlist>
  </Navigators>
)


推荐阅读