【问题标题】:Xidel json xpath - how get value of multiple elementsXidel json xpath - 如何获取多个元素的值
【发布时间】:2014-10-17 16:05:18
【问题描述】:

需要使用 Xidel 从 json 数据中获取多个元素的值。单元素查询如:

xidel - -e 'jn:members(json($raw))("client_name")'

xidel - -e 'jn:members(json($raw))("amount")'

工作正常,但谷歌搜索了很长时间,无法找到如何构造表达式以提取多个元素。以下尝试失败:

xidel - -e 'jn:members(json($raw))("client_name","amount")'
xidel - -e 'jn:members(json($raw))("client_name,amount")'
xidel - -e 'jn:members(json($raw))("client_name")("amount")'
xidel - -e 'jn:members(json($raw))[("client_name")("amount")]'

【问题讨论】:

    标签: json xpath xidel


    【解决方案1】:

    一些 Xidel 特定的东西(>=0.8 版本):

    1. 你不再需要json($raw)$json就足够了

    2. 它有自己的JSON读取语法,比起JSONiq更像XPath:

      xidel - -e 'jn:members($json) / (client_name, amount)'
      

      或喜欢在其他 cmets 中提出的问题:

      xidel - -e 'string-join($json / (id, your_name, total), ",")'
      

    在普通的 JSONiq 中,库函数可以使用:

      declare namespace libjn= "http://jsoniq.org/function-library"; 
      string-join(libjn:values(libjn:project($json, ("id", "your_name", "total"))), ",")
    

    【讨论】:

    • 第一行只给我“client_name”值,第二行给我这个错误:“err:XPTY0020: Context item is not a node” Xidel 0.8.4
    • 那么您有另一个输入文件,而不是粘贴在 pastebin 上的输入文件?甚至还有amount 属性(pastebin 上没有)?也许添加 jn:memberswhen there are multiple objects after all? Example with input: xidel -e 'let $json := {"id":1,"your_name":2,"total":3} return string-join($json / (id, your_name, total ), ",")'`
    【解决方案2】:

    我们需要查看您拥有的 JSON 以及您想要输出的一些说明,无论您是要输出 JSON 还是 XML 或字符串。

    这是一个适用于我的 Xidel 在线 DEMO 示例:

    let $data := [
      { "client_name": "Foo", "order": 1, "amount": 20 },
      { "client_name": "Bar", "order": 2, "amount": 30 }]
    for $order in jn:members($data)
    return $order("client_name") || ": " ||  $order("amount")
    

    并返回(我认为)一系列字符串

    Foo: 20
    Bar: 30
    

    如果你想返回一个 JSON 对象的三个属性,那么你应该可以使用

    let $obj := json($raw) return $obj("id") || ', ' || $obj("your_name") || ', ' || $obj("total")
    

    如果您不想使用管道,请尝试

    let $obj := json($raw) return concat($obj("id"), ", ", $obj("your_name"), ", ", $obj("total"))
    

    基于命令行的注释

    xidel - -e 'let $obj := json($raw) return concat($obj("id"), ", ", $obj("your_name"), ", ", $obj("total"))'
    

    应该这样做。

    甚至

    xidel - -e "let $obj := json($raw) return $obj('id') || ', ' || $obj('your_name') || ', ' || $obj('total')"
    

    【讨论】:

    • 此处为 JSON(私有数据替换为 'xxx'):pastebin.com/DHEGBx5z 我正在 Windows shell 中此 json 顶部编写一些操作,想要对值的纯文本:例如提取 "id,your_name and total" 想要 "349698","xxx","6222.0" 但更重要的是,因为我不是程序员,想要一些简单的表达式构造解释。研究了一些 Jsoniq 指南,但仍然没有理解。网上的例子太少了:-(
    • 样本看起来像一个单一的对象文字,我已经编辑了我的答案。
    • 对我来说没有意义...这是 jsoniq 表达式还是 xidel cmdline 参数?看起来像 unix 脚本文件。我尝试将其作为 xidel 表达式,但管道是 win cmdline 中的特殊字符,所以这不起作用。
    • 我发布的代码和现在在稍微不同的编辑中提供的代码是 XQuery 3.0 加上 JSONiq。至于将它与任何命令行 shell 集成,如果最新建议不起作用,那么希望其他人可以帮助解决命令行 shell 语法问题。
    • 如果你用'-e 参数加上引号,最后一个应该可以工作。带有|| 的那个可能会起作用,如果你用" 引号括起来(从Windows shell 中隐藏|)并将sn-p 中的" 替换为'(这样他们就不会感到困惑与外部")
    猜你喜欢
    • 2021-06-19
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2022-08-17
    相关资源
    最近更新 更多