首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于JSON的xpath与XML不同

用于JSON的xpath与XML不同
EN

Stack Overflow用户
提问于 2017-02-09 12:27:18
回答 1查看 480关注 0票数 2

我试图使用与访问XPath相同的技术将JSON转换成JSON。下面是两个相同XPath应用的等效结构。

代码语言:javascript
复制
let $json := xdmp:unquote('{
  "foo": {
    "bar": {
      "bas": "findme",
      "boo": "324"
    }
  }
}')

let $xml := <xml>
  <foo>
    <bar>
      <bas>findme</bas>
      <boo>324</boo>
    </bar>
  </foo>
</xml>

return (
    $xml//node()[./text() = "findme"], 
    $json//node()[./text() = "findme"]
)

我希望两者都能得到同样的结果,但我得到了以下结果:

XML结果

<bas>findme</bas>

JSON结果

{ "bas": "findme", "boo": "324" }

为什么不产生同样的结果呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-09 13:49:24

在MarkLogic中,text属性bas是一个命名的文本节点,它在XML中不存在。它的设计使得像//bas这样的东西对两者都适用。由于命名的文本节点,树结构在最深的层次上是不同的:

代码语言:javascript
复制
element bas {
  text { "findme" }
},
element boo {
  text { "324" }
}

相对于:

代码语言:javascript
复制
object-node {
  text bas { "findme" },
  text boo { "324" }
}

注:后者为伪码.正确使用JSON构造函数应该是:object-node { "bas": "findme", "boo": "324" }

通过使用fn:name() (顺便说一句,fn:local-name()在这里不起作用),也许有一种方法可以更接近您所追求的目标。试一试如下:

代码语言:javascript
复制
let $json := xdmp:unquote('{
  "foo": {
    "bar": {
      "bas": "findme",
      "boo": "324"
    }
  }
}')

let $xml := <xml>
  <foo>
    <bar>
      <bas>findme</bas>
      <boo>324</boo>
    </bar>
  </foo>
</xml>

let $xml-text := $xml//text()[. = "findme"]
let $json-text := $json//text()[. = "findme"]
for $t in ($xml-text, $json-text)
return
  if (name($t) eq "") then
    $t/..
  else
    object-node { name($t): $t }

哈哈!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42136732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档